C++ 为什么c++;11 std::使用模板初始化最大大小的数组不是构造函数?

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是一个数组。不是动态大小的数组。不是运行时大小的数组。它是一个数组,

c++11使用模板定义数组的最大大小(例如
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)
可以更大。我已经阅读了生成的汇编代码,现在知道了。谢谢