C++11 标准是否保证initializer_list对象的内存布局与交叉编译器兼容?

Does the C++11 standard guarantee the memory layout of initializer_list's objects are cross-compiler compatible?

本文关键字:布局 编译器 内存 是否 标准 initializer 对象 list C++11      更新时间:2023-10-16

vc++实现std::initializer_list如下:

template<class T>
class initializer_list
{
public:
    // ...
private:
    const value_type* _first;
    const value_type* _last;
};
然而,clang 3.4以另一种方式实现了std::initializer_list:
template<class T>
class initializer_list {
    const T* _p;
    size_t _size;
    // ...
};

显然,这两个定义不是二进制兼容的。

为什么c++标准没有明确定义std::initializer_list的内存布局兼容性?

c++标准特别没有强加实现细节,以允许实现以最有效的方式为目标硬件提供功能。该语言不会让您为不需要的功能付费,并且通常允许编译器做出广泛的决定,以根据给定硬件的大小/性能优化代码。指定特定的ABI可能会给编译器和已编译的c++程序带来不必要的负担。