C++ 为什么c++;11 std::使用模板初始化最大大小的数组不是构造函数?
c++11使用模板定义数组的最大大小(例如C++ 为什么c++;11 std::使用模板初始化最大大小的数组不是构造函数?,c++,c++11,C++,C++11,c++11使用模板定义数组的最大大小(例如std::array a1;),但不使用构造函数。(例如,std::array(5)a1;) 因为模板将为类生成代码,如果我有很多数组大小不同,那么将生成很多代码 (1)它可能导致编译时间增加。 2.它可能导致可执行文件的代码部分扩展。)std::array是指固定大小数组上的薄包装。对于动态大小的数组,有std::vector,因为如果没有,它将无法保持原来的状态 std::array是一个数组。不是动态大小的数组。不是运行时大小的数组。它是一个数组,
std::array a1;
),但不使用构造函数。(例如,std::array(5)a1;
)
因为模板将为类生成代码,如果我有很多数组大小不同,那么将生成很多代码
(1)它可能导致编译时间增加。
2.它可能导致可执行文件的代码部分扩展。)
std::array
是指固定大小数组上的薄包装。对于动态大小的数组,有std::vector
,因为如果没有,它将无法保持原来的状态
std::array
是一个数组。不是动态大小的数组。不是运行时大小的数组。它是一个数组,很像intarr[5]
C++是静态类型的语言,这意味着C++类型必须具有定义的编译时大小。上述示例中的code>arr具有一个大小;如果执行
sizeof(arr)
,您将获得sizeof(int)*5
sizeof(std::array)
也有一个大小,它由其中的元素数定义。因此,大小必须是编译时定义的数量,因为它是编译时定义的大小的一部分
std::array
与常规数组之间的区别是:
- 数组将隐式地衰减为指针<代码>标准::数组没有;您需要显式调用一个函数来实现这一点
- 数组是语言数组<代码>标准::数组,对于语言来说,是一个包含数组的结构
std::array
实现吗
那里没有多少
T操作符[](int-index){return elems[index];}
我认为获得该函数的数百个实例化不会是一个问题。begin
、size
、empty
等也是如此。您所说的代码几乎肯定是内联的 std::array的一个好处是它以最小的开销在堆栈上分配内存(除非声明全局对象)
如果数组大小是由构造函数参数确定的,则分配必须在堆上进行,一般来说,生成的对象在内存使用和性能方面效率较低。因为
std::array
包装数组。它字面上包含一个tarr[N]
。您不必担心生成的代码大小—std::array是“普通”数组的完美替代品,这意味着尽管编译器可能需要多次生成某些代码,这些大多是optmimizable的一行程序,当优化打开时,它们会给您留下与C数组相同的代码。@Xeo:Relevant:@Xeo:allowrelevant@迈赫达德:我看见一英里外有人来。:)“如果你做了sizeof(std::array)
,你会得到同样的结果。”——标准真的保证了吗?为什么std::array
不能像任何其他类类型一样具有尾部填充?@hvd谁说std::array
不能具有填充std::array
将(至少在大多数平台上)有@BцћNicol在这个答案中所做的。“同一件事”指的是sizeof(int)*5,不是吗?谢谢编辑,但看起来还是不对:arr
不能在int-arr[5]中添加空格代码>sizeof(int[5])
必须精确为sizeof(int)*5
sizeof(std::array)
可以更大。我已经阅读了生成的汇编代码,现在知道了。谢谢