【发布时间】:2016-10-05 09:48:00
【问题描述】:
我正在阅读an article about whole program optimization。链接时间代码生成部分的最后一段说,将分配在堆栈上的数组归零可能不会产生相同的效果,具体取决于它的归零方式:
开启整个程序优化确实发现了几个具有未定义行为的错误。如果没有 WPO,这些都不会以某种方式崩溃。有了 WPO,他们做到了。在一种情况下,成员函数调用是通过指向未初始化内存的指针进行的。在其他几种情况下,假设堆栈上的数组与其自己的地址相同。 也就是说,假设 memset(&charArray, 0, sizeof(charArray)) 将具有与 memset(charArray, 0, sizeof(charArray)) 相同的效果。标准不保证这一点,并且在 WPO 下似乎有所改变。
我想如果我做了char foo[1],那么foo 将永远是== 到&foo。有人可以解释这里发生了什么吗?谢谢
【问题讨论】:
-
这取决于作为函数参数传递的变量。在
char array[10]的情况下,例如函数scanf,无论您传递array还是&array,都将起作用。但是如果数组是动态获得的,比如array = malloc(10),那么它就非常重要了。在那种情况下array和&array是非常不同的。 -
@WeatherVane;不会。编译器会针对
&array发出警告。 -
@hacks 大概是在第一种情况下,是编译器警告,但功能正确。显然是第二种情况。
-
由于我们不知道
charArray的类型是什么,所以这个问题没有明确的答案。 -
这里的静态数组与 malloc 内存的真正傻瓜是
sizeof。
标签: c