C++编译器如何拷贝类/结构体中作为成员的数组数据?
平凡结构体中数组成员的拷贝实现逻辑
首先可以明确:编译器绝对不会生成this->arr_ = rhs.arr_这类赋值逻辑,因为C++语法层面原生数组本身就不支持直接拷贝赋值,这种写法本身就是非法的,不可能作为编译器实现的底层逻辑。
对于符合*平凡可拷贝(trivially copyable)*要求的结构体,它的平凡拷贝构造函数、平凡拷贝赋值运算符的语义是:完整拷贝对象的二进制表示,拷贝后的对象和原对象完全等价。编译器的具体实现通常分两种场景:
- 当数组成员体积很小(比如示例中只有7个int,共28字节),或者编译优化等级较低时,编译器会生成逐元素拷贝的指令:依次把
rhs.arr_[0]到rhs.arr_[6]的值逐个赋值给当前对象arr_的对应下标元素,逻辑上等价于手动写循环遍历拷贝所有元素。 - 当数组成员体积较大,或者编译优化等级较高时,编译器会直接把整个拷贝操作优化为等价的
memcpy调用,或是用SIMD向量指令做批量内存拷贝,本质是把整个结构体(包含数组的所有字节)完整复制到目标地址,最终效果和逐元素拷贝完全一致,但执行效率更高。
补充:你给出的示例代码里存在小笔误,
struc应为C++关键字struct。
内容的提问来源于stack exchange,提问作者Itachi Uchiwa
相关产品推荐
相关产品推荐

