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

时间:2014-07-03 13:55:39

标签: c++ c++11 compiler-construction compatibility initializer-list

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的内存布局以实现兼容性?

1 个答案:

答案 0 :(得分:2)

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