
C++
在我新声明一个局部变量后,某个性能测试函数的耗时突然从100毫秒涨到了500毫秒。其原因如下:仅在使用MSV
C++/x64/release编译时,若在m
AIn函数里声明了一个std::thread局部变量、一个32字节且8字节对齐的局部变量,还有一个volatile size_t局部变量(以及若干time_point变量),那么栈底寄存器rbp就不是8字节对齐的。这就使得用rbp + offset读写局部变量时,offset不是8的倍数,而CPU对8倍数的offset访问效率极高。所以非对齐的rbp会让CPU读写局部变量的时间增加数倍。又因为MSVC优化会自动内联较短的函数,所以这个名义上的函数没有开辟新的函数栈,而是沿用了m
AIn函数中未对齐的rbp。总的来说:第一,我声明了一个32字节的局部变量;第二,这使得rbp的值在十六进制下以9结尾;第三,这导致某个局部变量的地址为rbp - 9;第四,由于 - 9不能被8整除,读写rbp - 9地址变量的用时大大增加;第五,因为性能测试函数测试的是读写此变量的性能,所以性能测试函数的用时大幅提高。