免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: uusky_cu
打印 上一主题 下一主题

关于数组初始化的问题,问题相当有挑战!绝对不忽悠,请进! [复制链接]

论坛徽章:
0
31 [报告]
发表于 2011-08-26 12:25 |只看该作者
回复 13# smalloc

兄弟:你说的“可以用enum + union”。我乍看的时候,只是觉得比宏定义要方便一些而已,实际也是不能满足的。我不知道你有什么高招,请赐教!

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
32 [报告]
发表于 2011-08-26 12:27 |只看该作者
回复 31# uusky_cu


    可能真不行吧

论坛徽章:
0
33 [报告]
发表于 2011-08-26 12:33 |只看该作者
本帖最后由 uusky_cu 于 2011-08-26 12:35 编辑

回复 30# zylthinking

搞得我都乱了。哈哈……

其实我说宏定义不能满足的是如下情况,
假设
#define  val(x,y)     (x+y/5)

fuck_table={
       {1,2, val(1, 2)},
       {5,2, val(5, 2)},
       {6,8, val(6, 8 )},
};

那么后期维护的人,调整表格时,他只修改了1,2,忘了更新val(1,2)的话,就会出bug了。其实我想的是,有啥办法可以避免更新val值,程序员只需修改1,2,后面那个编译器自动更新上。
我想的枚举类型只是比宏定义方式好一点。根本上来讲同样也是不满足的。

问题就在于编译器有没有啥方法可以支持这样使用的情况。

论坛徽章:
0
34 [报告]
发表于 2011-08-26 12:40 |只看该作者
同时更新val(1,2), 将宏的范围扩大点即可。根本不是问题。

我理解楼主的意思,
是要只更新1,2,后面的5,2   6,8自动更新。

论坛徽章:
0
35 [报告]
发表于 2011-08-26 12:51 |只看该作者
回复 34# AD8018

我知道你说的,比如
#define  val(x,y)  {x,y, x+y/5}
这个方法好,避免了更新的问题。既然大家都明白这个意思了,我再来直接点的问题。哈哈……不要怪我变态。哈哈,只能怪这个芯片厂商奇怪。
为了避免定义很多这样的宏定义。我想的是编译器有没有办法,在数组初始化的时候,让我引用前面的已定义的成员。

问题就回到了我一楼的帖子。

论坛徽章:
0
36 [报告]
发表于 2011-08-26 12:55 |只看该作者
实际应用中,这样的表格数据往往远远不到1KB数据的话,而且这样的数据是放在程序的.data段的,操作系统使用DMA从PC磁盘IO载入程序时,就已经一道载入了。所以这样消耗的时间几乎可以忽略了。

uusky_cu 发表于 2011-08-26 12:07


这个不错,
    就是比 DMA载入1K数据,和CPU生成1K数据,哪个更快。

DMA的速度,大体取决于内存和外设的IO速度。
CPU速度,大体取决于内存和CPU的IO速度、cache和CPU主频。

这个我还真没有具体比较数字。
但是这样一来,如何做比较划算,我们都比较有谱了。

论坛徽章:
0
37 [报告]
发表于 2011-08-26 12:59 |只看该作者
回复  AD8018

我知道你说的,比如
#define  val(x,y)  {x,y, x+y/5}
这个方法好,避免了更新的问题。 ...
uusky_cu 发表于 2011-08-26 12:51



    就是要做宏循环嘛,这个没好办法。但是可以先出苦力写1000个宏,做出支持1000次循环的“宏循环基础构建”。

论坛徽章:
0
38 [报告]
发表于 2011-08-26 13:11 |只看该作者
还好,楼主不要返回栈里的内存给别人使用!
去一个公司面试,要我用模版从栈上分配内存并初始化,返回给调用者使用!

论坛徽章:
0
39 [报告]
发表于 2011-08-26 13:22 |只看该作者
回复 36# AD8018

其实我问题不是这个啊。哈哈……
不过可以讨论就是了。首先前提是这个表格数据一定要是静态定义在程序中的,而不是程序运行期间读取文件进来的。

那么实际上这个表格初始化了可能跟没有初始化情况一样,都可能会占用程序在磁盘上存储空间。也就是说如果这个表格没有初始化,编译器可能会将其放入.bss段中,如果初始化了的话,编译器会将其放到.data段中。但是就这个表格部分初始化的情况,可能还是会放到.data段,具体编译后查看一下就知道了。排除放到.bss情况的话,实际上是静态初始化完全获胜了。因为在.data段的数据不管你有没有初始化,都需要载入到内存的。就是说两者载入所消耗的时间是一样的,相比较而言动态初始化的时候,程序运行期间还多了一个初始化的过程。

那么另一个情况,如果这段数据在.bss段的话,程序载入时,可能需要向OS申请内存。这个可能也是需要耗时间。尤其在内存紧张的条件下。

论坛徽章:
0
40 [报告]
发表于 2011-08-26 13:27 |只看该作者
本帖最后由 uusky_cu 于 2011-08-26 13:29 编辑

回复 38# davidfoxhu

从栈上分配内存???

我不明白是什么意思,按照我的理解的话,也很容易。不过我不使用C++的什么东东,因为我不懂……其他要求呢?说来听听?C++的话就算了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP