Gcc使用memcpy进行隐式复制赋值运算符而不是成员复制

时间:2018-03-07 15:03:11

标签: c++ g++ copy-constructor copy-assignment

遵循c ++ 11标准,我认为只要两个对象之间的赋值完成,g ++就会隐式使用成员方式的副本。令人惊讶的是,我注意到与标准相反,g ++似乎调用了一个大小与对象实际大小相当的memcpy。下面是我的意思的片段。

#include <stdio.h>

class Classe {
public:
    Classe(char m1 = 0, int m2 = 0) : membro1(m1), membro2(m2) {};

    void setMembro1(char m1)    {membro1 = m1;}
    void setMembro2(int m2)     {membro2 = m2;}
    char getMembro1() const     {return membro1;}
    int getMembro2() const      {return membro2;}
private:
    char membro1;
    int membro2;
};

Classe c;

void function() {
    c = Classe('a', 1);
}

int main() {
    char ciao[] = "HELLO!";
    printf("Ciao\n");
    function();
    printf("%d\n", sizeof(Classe));
}

在执行结束时,我预计“c”对象所在的内存是{0x61,0x00,0x00,0x00,0x01,0x00,0x00,0x00},但显然是在第一个位置旁边(其中包含0x61),“函数”函数数据的一些堆栈实际上被复制了,这是不正确的,imho。

你知道发生了什么吗? 非常感谢你的努力。

0 个答案:

没有答案