malloc和gcc优化2

5
while(count < 30000000){
    malloc(24);
    count++;
}

上述代码在我的电脑上使用gcc -O0编译大约需要170毫秒。然而,如果使用-Ox(其中x>0)进行编译,优化器会巧妙地发现所请求的内存永远不会被使用,因此将其从优化后的可执行文件中排除掉。它是如何做到这一点的呢?


3
标题中的 2 代表什么意思不太清楚。 - Yu Hao
@YuHao 他们提到了他们之前的问题 - Hi-Angel
1个回答

10

编译器发现malloc的返回值从未被使用,因此将其优化掉了。如果您想防止malloc调用即使在-O3下也被优化掉,您可以使用volatile限定符:

while(count < 30000000){
    void * volatile p = malloc(24);
    count++;
}

谢谢你的回答和解决方案。真的很棒。这是否意味着编译器知道malloc符号?我不知道还有其他方法可以实现。我的意思是,如果你自己编写了分配器,你能引发相同的行为吗? - user2616927
@user2616927 优化器知道malloc并认为它是一个没有副作用的函数。 - ouah
2
是的,你可以使用pureconst 属性来允许优化器对你自己的函数进行类似的优化。 - Carl Norum
@Carl Norum 你是怎么发现的? - user2616927
对,我从手册上看到它用于无副作用的函数。干得好。谢谢。 - user2616927
@user2616927 如果你喜欢这个答案,你可以选择它;-) - meaning-matters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接