我在这里读到,如果编译器memset知道传递的内存缓冲区永远不再使用,则可以自由删除调用.怎么可能?在我看来(从核心语言的角度来看)memset只是一个常规函数,编译器无权假设其中发生的任何事情都没有副作用.
在链接文章中,他们展示了如何删除Visual C++ 10 memset.我知道Microsoft编译器在标准合规性方面并不领先,所以我问 - 它是按照标准,还是仅仅是msvc-ism?如果符合标准,请详细说明;)
编辑: @Cubbi
以下代码:
void testIt(){
char foo[1234];
for (int i=0; i<1233; i++){
foo[i] = rand()%('Z'-'A'+1)+'A';
}
foo[1233]=0;
printf(foo);
memset(foo, 0, 1234);
}
Run Code Online (Sandbox Code Playgroud)
在mingw下用线编译:
g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -o main.o main.cpp
g++ -Wl,-s -Wl,-subsystem,console -mthreads -o main.exe main.o
objdump -d -M intel -S main.exe > dump.asm
Run Code Online (Sandbox Code Playgroud)
给出输出:
4013b0: 55 push ebp
4013b1: 89 e5 mov ebp,esp
4013b3: 57 push …Run Code Online (Sandbox Code Playgroud)