【发布时间】:2012-04-08 18:01:36
【问题描述】:
使用此代码:
#include <iostream>
#include <list>
int main() {
std::cout << sizeof(std::list<void*>) << std::endl;
};
我设法注意到,在 GCC 4.7 上,std::list<void*> 在 C++98 上的大小是 16 字节,而在 C++11 上它的大小是 24 字节。
我想知道 std::list 发生了什么变化,使它变大了。
【问题讨论】:
-
从技术角度来看,这种行为完全是特定于实现的。如果他们愿意,图书馆作者可以任意决定将类扩大 100 倍,而无需任何理由。编写任何取决于列表大小正好为 16 字节的代码可能不是一个好主意。你在做什么,这实际上导致了一个错误?
-
看看这里:en.cppreference.com/w/cpp/container/list 你会看到一些成员类型在 c++11 的 std::list 中发生了变化。
-
他们可能缓存了列表大小。 24 字节是三个 64 位值 - 一个开始指针、一个结束指针和一个大小。
-
没有注意到,我正在将 C++98 库与 C++11 应用程序链接起来。由于 std::list 导致的不同类内存布局,这个库有一些内联 getter 得到错误的内存变量。
-
@dexametason- 很抱歉,我没有看到任何会迫使实现使用更大尺寸的接口更改。你能具体指出你指的是什么吗?