gpt4 book ai didi

c++ - 是否为空函数将参数加载到缓存中?

转载 作者:太空宇宙 更新时间:2023-11-04 15:12:14 29 4
gpt4 key购买 nike

我知道 C++ 编译器会优化空(静态)函数。

基于这些知识,我编写了一段代码,只要我定义了某个标识符(使用编译器的 -D 选项),它就应该被优化掉。考虑以下虚拟示例:

#include <iostream>

#ifdef NO_INC

struct T {
static inline void inc(int& v, int i) {}
};

#else

struct T {
static inline void inc(int& v, int i) {
v += i;
}
};

#endif

int main(int argc, char* argv[]) {
int a = 42;

for (int i = 0; i < argc; ++i)
T::inc(a, i);

std::cout << a;
}

所需的行为如下:每当定义了 NO_INC 标识符(编译时使用 -DNO_INC),所有对 T::inc(...) 的调用都应该被优化离开(由于函数体为空)。否则,对 T::inc(...) 的调用应该触发某个给定值 i 的增量。

我有两个问题:

  1. 我的假设是否正确,当我指定 -DNO_INC 选项时,调用 T::inc(...) 不会对性能产生负面影响,因为调用空函数优化了吗?
  2. 我想知道当 T::inc(a, i) 时变量(ai)是否仍然加载到缓存中尽管函数体为空,但仍被调用(假设它们还不存在)。

感谢您的任何建议!

最佳答案

Compiler Explorer是查看生成程序的汇编的非常有用的工具,因为没有其他方法可以确定编译器是否优化了某些东西。 Demo .

随着实际递增,您的 main 看起来像:

main:                                   # @main
push rax
test edi, edi
jle .LBB0_1
lea eax, [rdi - 1]
lea ecx, [rdi - 2]
imul rcx, rax
shr rcx
lea esi, [rcx + rdi]
add esi, 41
jmp .LBB0_3
.LBB0_1:
mov esi, 42
.LBB0_3:
mov edi, offset std::cout
call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
xor eax, eax
pop rcx
ret

如您所见,编译器完全内联了对 T::inc 的调用并直接进行递增。

对于一个空的 T::inc 你会得到:

main:                                   # @main
push rax
mov edi, offset std::cout
mov esi, 42
call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
xor eax, eax
pop rcx
ret

编译器优化了整个循环!

Is my assumption correct that calls to t.inc(...) do not affect the performance negatively when I specify the -DNO_INC option because the call to the empty function is optimized?

是的。

If my assumption holds, does it also hold for more complex function bodies (in the #else branch)?

不,对于“复杂”的某些定义。编译器使用启发式方法来确定是否值得内联一个函数,并以此为基础做出决定。

I wonder if the variables (a and i) are still loaded into the cache when t.inc(a, i) is called (assuming they are not there yet) although the function body is empty.

不,如上所述,循环甚至不存在。

关于c++ - 是否为空函数将参数加载到缓存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52094411/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com