我想知道在unix上使用g ++编译时,while(1);
函数中只有main()
的程序会发生什么。当我运行程序时,我看到0%的CPU使用率。为什么是这样?它应该不会占用CPU吗?
编译器是否以某种方式优化了这个?通过像上下文切换出的系统调用一样使用yield_processor吗?
使用默认优化(仅编译为g++ source.cpp
)
int main()
{
while(1);
}
谢谢!
答案 0 :(得分:1)
由于while()体中没有显示任何dependecies,gcc会为这段代码生成一个空的三字符。现在,根据您实际使用的标准标志(同样,检查环境变量CFLAGS和CXXFLAGS,如果在* nix环境中),编译器不会生成asm“hogging”代码。
在执行g++ -S source.cpp
source.s文件(包含ASM代码)后,如果已生成循环,请检查。
这是我的输出,没有g ++(GCC)4.5.0 20090910(实验)的优化标记:
.text
.globl _main
_main:
LFB0:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
L2:
jmp L2
LFE0:
.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
EH_frame1:
.set L$set$0,LECIE1-LSCIE1
.long L$set$0
LSCIE1:
.long 0x0
.byte 0x1
.ascii "zPR\0"
.byte 0x1
.byte 0x78
.byte 0x10
.byte 0x6
.byte 0x9b
.long ___gxx_personality_v0+4@GOTPCREL
.byte 0x10
.byte 0xc
.byte 0x7
.byte 0x8
.byte 0x90
.byte 0x1
.align 3
LECIE1:
.globl _main.eh
_main.eh:
LSFDE1:
.set L$set$1,LEFDE1-LASFDE1
.long L$set$1
LASFDE1:
.long LASFDE1-EH_frame1
.quad LFB0-.
.set L$set$2,LFE0-LFB0
.quad L$set$2
.byte 0x0
.byte 0x4
.set L$set$3,LCFI0-LFB0
.long L$set$3
.byte 0xe
.byte 0x10
.byte 0x86
.byte 0x2
.byte 0x4
.set L$set$4,LCFI1-LCFI0
.long L$set$4
.byte 0xd
.byte 0x6
.align 3
LEFDE1:
.constructor
.destructor
.align 1
.subsections_via_symbols
此代码按预期占用了我的CPU(在Mac OSX 10.6.1上)。
答案 1 :(得分:0)
您的代码中存在错误,优化过多(不太可能),或者误读了您的cpu使用情况。
无论如何,你是对的。它应该“占用cpu。”
答案 2 :(得分:0)
严格遵守编译器使用此代码做一些聪明的事情的规则。在“似乎”规则下,你的程序无法判断它是在循环中旋转,还是只是在睡觉。
我想了解更多关于您正在运行的GCC版本以及操作系统的更多信息。 Mac OS X上的GCC-4对此代码没有任何特殊之处。
当然,您的操作系统可能会为一个进程设置CPU使用限制。不过,我认为这个过程会停止。