C++备忘录102:Always Auto may have extra overhead

本文探讨了在C++中使用'Always Auto'时,由于默认构造函数的存在可能导致的额外性能开销。当对象不需要初始值且后续会被覆盖时,这种开销尤为值得注意。
摘要由CSDN通过智能技术生成

当有buffer随后会被覆盖,所以一开始的初始化没有意义的时候,要小心AAA带来的额外性能损耗

auto s = S() without ctor

struct S {
    void foo();
private:
    char buf[1024];
};

void foo() {
    auto s = S{}; // value initialization
    s.foo();
}

S中的buf此时会被初始化成全0值

foo():                                # @foo()
        push    rbx
        sub     rsp, 1024
        mov     rbx, rsp               # zero out buf
        mov     edx, 1024.             #
        mov     rdi, rbx               #
        xor     esi, esi               #
        call    memset@PLT             #
        mov     rdi, rbx
        call    S::foo()
        add     rsp, 1024
        pop     rbx
        ret

因为auto s = S()的形式是value initialization,此时

the object is zero-initialized

auto s = S() with defaulted ctor

如果给一个default的构造函数的话

struct S {
    S() = default;
    void foo();
private:
    char buf[1024];
};

void foo() {
    auto s = S{};
    s.foo();
}

结果和上面一样,因为

if T is a class type with a default constructor that is neither user-provided nor deleted (that is, it may be a class with an implicitly-defined or defaulted default constructor), the object is zero-initialized and then it is default-initialized if it has a non-trivial default constructor

auto s = S() with user-provided empty ctor

如果给空的构造函数体

struct S {
    S() {}
    void foo();
private:
    char buf[1024];
};

void foo() {
    auto s = S{};
    s.foo();
}

此时buf不会初始化

foo():                                # @foo()
        sub     rsp, 1032
        lea     rdi, [rsp + 8]
        call    S::foo()
        add     rsp, 1032
        ret

if T is a class type with at least one user-provided constructor of any kind, the default constructor is called

而此时默认构造函数没有初始化buf

S s without ctor

struct S {
    void foo();
private:
    char buf[1024];
};

void foo() {
    S s;   // default initialization
    s.foo();
}

此时buf不会被初始化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值