gpt4 book ai didi

C++ 模板 : Convincing self against code bloat

转载 作者:IT老高 更新时间:2023-10-28 22:32:40 24 4
gpt4 key购买 nike

我听说过 C++ 模板上下文中的代码膨胀。我知道现代 C++ 编译器并非如此。但是,我想构建一个例子并说服自己。

假设我们有一个类

template< typename T, size_t N >
class Array {
public:
T * data();
private:
T elems_[ N ];
};

template< typename T, size_t N >
T * Array<T>::data() {
return elems_;
}

此外,假设 types.h 包含

typedef Array< int, 100 > MyArray;

x.cpp 包含

MyArray ArrayX;

y.cpp包含

MyArray ArrayY;

现在,如何验证 MyArray::data() 的代码空间对于 ArrayXArrayY 是否相同?

我还应该从这个(或其他类似的简单)示例中了解和验证什么?如果有任何 g++ 特定的提示,我也对此感兴趣。

PS:关于膨胀,我什至担心最轻微的膨胀,因为我来自嵌入式上下文。


补充:如果模板类被显式实例化,情况是否会发生变化?

最佳答案

您问错了问题 - 您的示例中的任何“膨胀”都与模板无关。 (顺便说一句,您的问题的答案是获取两个模块中成员函数的地址,您会发现它们是相同的)

您真正想问的是,对于每个模板实例化,生成的可执行文件是否线性增长?答案是否定的,链接器/优化器会变魔术。

编译一个创建一种类型的exe:

Array< int, 100 > MyArray;

注意生成的 exe 大小。现在再做一次:

Array< int, 100 > MyArray;
Array< int, 99 > MyArray;

等等,对于大约 30 个不同的版本,绘制生成的 exe 大小图表。如果模板像人们想象的那样可怕,那么每个唯一模板实例化的 exe 大小都会以固定的量增长。

关于C++ 模板 : Convincing self against code bloat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2918414/

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