gpt4 book ai didi

C++ 模板函数,相同类型,多个实例化 : shares one same copy of code? 甚至在不同的 cpp/目标文件中

转载 作者:行者123 更新时间:2023-11-30 02:28:25 27 4
gpt4 key购买 nike

例如,考虑以下代码:

// f.h
template <typename T>
int f(T x) {
return x+1;
}

如果我们在 foo.cppbar.cpp 中实例化它:

//foo.cpp instantiation:
int i = f(1);

//bar.cpp instantiation:
int j = f(2);

最终程序是否只使用一份代码?是不是这样,当bar.cpp被隐藏,只提供目标文件bar.o

我认为,由于每个cpp文件都是独立编译的,所以foo.obar.o都必须包含f(int)。链接器应该看到相同的重复签名,并且只使用一个拷贝。我说得对吗?

最佳答案

是的,链接器通常会将重复的相同模板实例化掉。这样做非常需要避免涉及模板时二进制大小的爆炸,并保持一些标准要求的不变量,例如函数指针的等价性。这种行为有时称为按名称折叠

除此之外,some linkers甚至会折叠所有发生内容相同的符号(即,编译相同的代码),即使它们不是源自相同的定义。这有时称为按值折叠,但除非小心操作,否则可能会破坏标准的字母(即,因为指向不同函数的函数指针现在比较相等)。

关于C++ 模板函数,相同类型,多个实例化 : shares one same copy of code? 甚至在不同的 cpp/目标文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40778086/

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