c++ - 基本类型是如何初始化的?

标签 c++

基本类型(例如整数)是如何初始化的?他们有移动和复制语义吗?他们实际上有构造函数吗?当遇到以下有关直接初始化的问题时,我感到很困惑:

Otherwise, standard conversions are used, if necessary, to convert the value of other to the cv-unqualified version of T, and the initial value of the object being initialized is the (possibly converted) value.

只是说被初始化的对象的初始值为value,但没有说这是怎么做到的。是否调用了某些构造函数,是否移动了某些内存或者会发生什么?

是否有详细解释如何根据上下文完成基本类型的初始化?我在标准中找不到它。

最佳答案

原始类型总是被复制,因为没有什么可以移动,尽管它们可以在移动语义中使用。移动语义最初是为了让容器在数据转换完成时源对象将被销毁时避免不必要的数据复制。原始类型不是容器,您实际上无法“转移数据所有权并将原始容器留空”,因此没有任何内容可以移动。如果您检查任何编译器生成的汇编代码,您会发现“移动”实际上是一条 mov 指令,这意味着数据只是从一个寄存器复制到另一个寄存器,或者在内存和注册表之间复制。由于架构的原因,这种行为在大多数现代 CPU 中基本相同。

它们没有构造函数或析构函数,因为它们不是类的实例,尽管它们的行为就像有虚拟实例一样。

当首次定义但未初始化时,无论是显式还是隐式1,它们的初始状态都是“不确定的”。你不知道它们的值是什么,也不知道它是否是 trap representation 。您甚至无法对不确定值 including assuming that x == x is true 执行任何操作,这是没有必要的。因此,最后,原始类型的未初始化变量是无用的(unsigned char 或任何无符号 1 字节整数等效类型除外)。

1。一个非常简单的隐式初始化是当您在文件范围定义变量时,它将自动为零初始化。或者当您定义具有相同效果的静态变量时。

关于c++ - 基本类型是如何初始化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48230326/

相关文章:

c++ - 生成迷你文本转储 LInux

c++ - 如果函数模板已经推断出返回类型,有没有办法在不实例化定义的情况下调用它?

C++ 保留指向模板对象的指针集合,所有指针都派生自非模板类

c++ - 在命名空间声明之后声明 using 语句

c++ - 使用 Dijkstra 在 boost 图中查找最短路径

c++ - sizeof 运算符为 C 和 C++ 返回不同的值?

c++ - InternetReadFile 问题(错误 87 - 参数不正确)

c++ - 指针值丢失

用于原始文件流元数据的字节序感知读取的 C++ 库?

c++ - 在 C++ 中,如何将 uint16_t 变量传递给带有参数 unsigned int & 的函数?