在C中,二维数组只是一维数组的简洁索引scheme。 就像使用一维数组一样,2D数组分配一个连续内存块, A[row][col]符号类似于A[row*NCOLS+col] 。

通常,如果要使用单维数组来实现自己的multidimensional array,您可以编写一个索引函数:

int getIndex(int row, int col) { return row*NCOLS+col; }

假设你的编译器内嵌了这个函数,这里的性能就好像你使用了二维数组的内build“索引函数”一样。

为了显示:

#define NROWS 10 #define NCOLS 20

这个:

int main(int argc, char *argv[]) { int myArr[NROWS*NCOLS]; for (int i=0; i

应该像这样执行相同的操作:

int main(int argc, char *argv[]) { int myArr[NROWS][NCOLS]; for (int i=0; i

虽然正如AraK所 指出的那样 ,如果你跳过很多行,并且行很大,可能会遇到很多页面错误…在这种情况下,自定义索引函数(行和列转换)可以帮助,但是也可以简单地改变一个二维数组中的哪一个维度,你把它当作行,哪一个当作列处理。

实际上,如果你在C中使用所谓的二维数组,编译器会为你做一维数组映射。 如果使用一维数组,并且想将其视为二维数组,则必须自己编写映射。

唯一需要注意的是你应该按行访问数组,因为C编译器会在你的行之后存储你的二维数组。 如果您按列方式访问“大”二维数组,则页面错误可能会发生。 即使您使用仅支持一维数组的语言进行编程,也可以轻松地将映射写入任意数量的维度。

看看这个维基百科文章,如果你想按行进行映射 。 您的映射可能是列式的,比如FORTRANmatrix。

我不认为有任何区别。 在内部,c按照几个一维数组顺序处理二维数组。

但是,与所有performance一样,您的里程可能会有所不同。 可能会有某种微妙的指针算术差异。 在两种情况下运行定时testing。 无论哪一个跑得快赢。

罗伯特是正确的。 索引expression式被编译为指针算术expression式,所以没有区别。

然而,可以产生影响的是访问顺序,因此您可能需要自己实现,以便控制访问顺序。 例如列第一列和第一列的forms。

在现代处理器上,以各种方式访问​​大型arrays可能会产生意想不到的性能差异。 顺序访问总是最快的,由于caching交互,其他步幅可能会降低30倍。 内部维度是2的幂的multidimensional array通常具有差的性能,因为它们与caching关联性相互作用的方式。 要了解这些问题,没有什么真正的替代做测量。

正如其他人所说的,不同之处在于你如何访问你的项目:如果你的项目是在内存中的布局,至less在通用架构上是线性的,那么重要的是什么。 因此,所有你真正的是1d数组,2d等等“只是”一个方便,一个合理的编译器应该优化索引 – 但实际上,一旦你有不止一个variables,编译器往往会失败比如x86,因为寄存器不足。

现在,这取决于你的应用程序,但我认为你应该默认使用1d布局,特别是如果你需要处理多个维度的话。 C语言中multidimensional array的第一个问题是你不能dynamic地分配它们,如果你按照行的方式进行分配,你将会有非常糟糕的performance,因为你没有连续的内存。 有关详细信息,请参阅FFTW文档 。

请注意,你总是可以用方便的数组索引来描述你的单个内存块(你分配一个大的nxm内存块,然后为每一行创build一个n指针数组)。

我只是猜测,但我会说1D数组比2D数组快。 但是,这不会显着加快。 有点像$ 1,000,000.01超过$ 1,000,000。

我会使用任何更容易编码。

C语言 一维数组比二维运算快吗,二维数组与一维数组的性能相关推荐

  1. 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )

    文章目录 一.指针数组 和 二维数组 数据 拷贝到 自定义二级指针 中 1.函数形参 设计规则 2.三种内存模型 对应 函数形参 指针退化规则 二.完整代码示例 一.指针数组 和 二维数组 数据 拷贝 ...

  2. Java黑皮书课后题第8章:*8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置。返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标

    *8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置.返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标 题目 题目描述与运行示例 破题 代码 题目 ...

  3. C语言编程>第二十一周 ② 请补充main 函数,该函数的功能是:把一维数组中的元素逆置,结果仍然保存在原数组中。

    例题:请补充main 函数,该函数的功能是:把一维数组中的元素逆置,结果仍然保存在原数组中. 注意:仅在横线上填写所需的若干表达式或语句,请勿改动函数中的其它任何内容. 代码如下: #include& ...

  4. C语言基础知识之define宏定义表达式,undef,内存对齐,a和a的区别,数组知识点,int (*)[10] p,二维数组参数与二维指针参数,函数指针数组,常见的内存错误及对策

    一.用define宏定义表达式 1.定义一年有多少秒: #define SEC_A_YEAR 60*60*24*365 //上述描述不可靠,没有考虑到在16位系统下把这样一个数赋给整型变量的时候可能会 ...

  5. 关于图的二维矩阵转为一维数组的理解。

    一开始看二维矩阵转为一维数组的时候还是有点懵的,为啥是N(N+1)/2呢,为啥不是N*N/2呢,这个矩阵明明是N*N的一个正方形啊,我要省一半空间直接除2不就行了,带着这个问题我观察了一下这个PPT里 ...

  6. C语言练习二 :找出一个二维数组的鞍点

    1.鞍点的定义:某个元素在其所在行中最大.所在列中最小. 2.程序代码 //求一个二维数组的鞍点 二维数组可能没有鞍点,如果有,只能有一个 #include<stdio.h> int ma ...

  7. c语言中二维数组中维数的计算,数组指针字符串C语言程序设计-第4章.ppt

    <数组指针字符串C语言程序设计-第4章.ppt>由会员分享,可在线阅读,更多相关<数组指针字符串C语言程序设计-第4章.ppt(132页珍藏版)>请在人人文库网上搜索. 1.程 ...

  8. 嵌入式 ARM 汇编编程例题(二维数组按规律求和,求两数 gcd / lcm,求数组 min / max,字符串复制,排序)

    文章目录 0x00. 整数加减乘除 0x01. 一维数组按某种规律求和 0x01.1 求 1~100 之和 0x01.2. 求一维数组的和 0x01.2. 求一维数组的所有奇数的和 0x02. 二维数 ...

  9. 信息学奥赛一本通1267:【例9.11】01背包问题(二维dp与滚动数组优化)

    [题目描述] 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,. ...

最新文章

  1. CentOS6 修改主机名的规范步骤
  2. ceph-deploy部署bluestore
  3. Harvard-X免费生物信息课程 (代码、文档、数据) - 适合系统学习
  4. spring4.0基于Java配置_Spring MVC学习笔记之Controller查找(基于Spring4.0.3)
  5. mysql5.7.26修改账号密码_修改mysql5.7的用户密码
  6. Linux下卸载vmware
  7. 解读2015之大数据篇:大数据的黄金时代
  8. 新浪微博 android2.3,BlackLight新浪微博客户端
  9. Spring-Kafka
  10. CodeCademy | Python | 6. Pyglatin
  11. 计算机管理器用户怎么打开,win10无法使用内置管理员账户打开计算器如何设置...
  12. 关于Java的二十篇技术热文
  13. 开源录屏软件Captura安装和使用
  14. java的博_小博老师解析Java核心技术 ——I/O流
  15. 膜拜,阿里内部都在学习的五大深入理解Java虚拟机PDF,简直强无敌
  16. 张飞硬件MOSFET驱动电路_sdchguyi_新浪博客
  17. 视频直播平台性能测试
  18. URL Schemes备份
  19. 蛋壳公寓信息/信息网爬取/小猪短租/豆瓣/拉钩/人民邮电报/百度电视剧/加载更多-获取字符串中间任意内容
  20. ABAQUS有限元仿真计算工作站单机多核/多机多核集群硬件配置详解

热门文章

  1. 【元宇宙欧米说】探索元宇宙的“数字美学”
  2. textrank提取关键词与关键句
  3. 幂级数展开求积分_72道积分题 略详解析(51-72)
  4. Maven私有仓库上传及使用
  5. QQ空间爬虫最新分享,一天 400 万条数据(附代码地址)
  6. Ubuntu安装QQ、百度网盘
  7. 用计算机写词,用遗传算法让电脑写宋词
  8. containskey java_Java Map.containsKey()方法:判断Map集合对象中是否包含指定的键名
  9. linux 僵死日志,linux 僵死进程及处理
  10. 三流大学毕业的我,如何一年内进入大公司