gpt4 book ai didi

c++ - c++ 中的静态成员函数是否在多个翻译单元中复制?

转载 作者:可可西里 更新时间:2023-11-01 17:38:31 36 4
gpt4 key购买 nike

我的程序中有一个辅助类,它有许多在我的程序的不同类中使用的静态函数。例如

helper.h:

Class helper {
public:
static void fn1 ()
{ /* defined in header itself */ }

/* fn2 defined in src file helper.cpp */
static void fn2();
}

Helper 只有静态成员函数。因此,其他模块不会创建任何 helper 对象。辅助函数用于其他模块,例如:

A.cpp

#include "helper.h"
A::foo() {
helper::fn1();
helper::fn2();
}

B.cpp

#include "helper.h"
B::foo() {
helper::fn1();
helper::fn2();
}

编译器是否在 A.cppB.cpp 中创建辅助函数的单独拷贝?我阅读了一些较早的帖子,并从编译器将创建的回复中收集到。但是当我将 fn1fn2 的地址打印为 printf("Address of fn1 is %p\n", &helper::fn1);printf("Address of fn1 is %p\n", &helper::fn1); 来自 A.cppB.cpp,我得到相同的地址。我现在很困惑。有人可以澄清一下,如果我遗漏了什么。

我担心辅助函数的多个拷贝(如果发生的话)的原因是我们正试图减小可执行文件的大小并希望对其进行优化。

最佳答案

在类体内定义的函数被隐式标记为inline。如果你获取函数的地址,编译器也会创建函数的常规拷贝(每个编译单元),但链接器只会选择这些拷贝中的一个包含在可执行文件中,因此只有一个地址。

但是,内联过程可能会复制很多函数,甚至超过编译单元的数量。通常,通过消除参数传递和函数调用开销以及消除公共(public)子表达式的机会等可能增加的优化来抵消复制代码增加的大小。尽管内联通常被认为是大小和速度之间的权衡,但大小增加通常可以忽略不计甚至为负。

刚刚在类中声明然后在单个编译单元中实现的函数,在可执行文件中肯定只有一个拷贝。

关于c++ - c++ 中的静态成员函数是否在多个翻译单元中复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5372091/

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