2013-10-03 57 views
4

出于好奇,我看了一下std :: array的LLVM实现,并注意到它是一个结构体。我看过的大多数其他STL容器(矢量,队列,地图)都是类。它作为一个结构出现在标准中,所以是故意的。为什么C++ 11 std :: array结构而不是类?

任何人都知道这可能是为什么?

+2

它似乎是一个常用的POD类型结构的惯例,但我不知道这是否是原因。 –

+2

聚合可能没有私人或受保护的成员,并且'std :: array'必须是聚合。 – dyp

回答

10

从技术上讲,它既不是结构也不是类 - 它是一个模板。

std::array必须是aggregate。长话短说,这最终意味着它不能拥有任何私人的东西 - 所以它可能被写为struct(默认为公开),而不是class(默认为使所有内容私人的)。

如果你想你可以写为class反正:

template <...> 
class array { 
public: 
// ... 

但你需要让一切公开,所以你还不如用一个struct在默认情况下做到这一点。

+0

感谢您的回答!你知道为什么决定使std :: array成为一个聚合吗? – elSnape

+1

@elSnape'std :: array'比C++ 11(boost,C++ 03TR1)旧,并且需要C++ 03中的聚合初始化语法,用于像'std :: array my_arr = {1, 2,3,4,5};' – dyp

+4

@elSnape因为std :: array需要尽可能的小。一个设计决定是所有std :: array的代码都应该在编译时消失,以使其与裸数组一样高效(空间和时间)。 –

1

std::array是POD类型,以便它可以像这样进行初始化:

std::array<int, 5> arr = { 1, 2, 3, 4, 5 }; 

这是从在一个initializer_list初始化不同阵列实际上并不对阵列元件和移动分配新的空间来自初始化器列表的数据在那里,但括号中的数据(最终在初始化的数据段中)数组的内部表示。

这意味着没有复制或移动,实际上没有代码正在运行来初始化任何东西。只要将可执行文件加载到内存中,阵列就准备就绪。

+0

可变模板构造函数可以具有相同的语法,并且移动elision(+优化)应该导致相同的速度。 – dyp

+0

@DyP不,因为那仍然需要代码才能运行。对于'std :: array' *,没有代码在运行时进行任何初始化*。零。还记得我评论过的其他帖子吗? “没有代码”的速度就像你得到的那样快。 – Fozi

+0

@DyP此外,这还解决了一些其他问题,如初始化的未定义顺序和全局静态对象的破坏。这根本不适用于简单类型的'std :: array's。他们来到pre-initalized并存在,直到OS释放进程的内存,就像C风格的阵列。 – Fozi

相关问题