局部变量声明为何使性能测试函数耗时暴增?

1个回答

写回答

邪恶力量1216

2026-01-06 00:57

+ 关注

C++
C++

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

举报有用(0分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号