int i{0} 初始化方式是否永远比 int i = 0 赋值初始化性能更快?
问题结论
你的理解是完全错误的,两种写法不存在你以为的性能差异。
内置类型场景(如你举例的int)
C++标准中明确定义,变量声明时跟在=后的是初始化逻辑,和后续的赋值操作是完全不同的语义。对于int这类内置标量类型:
- 写法
int i{0};属于列表初始化,语义是将i初始化为0 - 写法
int i = 0;属于复制初始化,语义同样是将i初始化为0
两种写法不存在任何语义差异,也完全不存在你认为的“先创建无初值变量再赋值”的过程。哪怕完全不开启优化,所有符合C++标准的编译器对这两行代码生成的底层指令都完全一致,没有任何性能区别。
自定义类类型场景
就算换成自定义的类类型,两种写法也不会有可感知的性能差异:
- 写法(1)是直接列表初始化,只会调用一次匹配的构造函数
- 写法(2)是复制初始化,C17之前标准允许编译器做复制消除优化,跳过临时对象创建、直接调用构造函数初始化目标对象,几乎所有编译器都会默认开启这个优化;C17之后标准强制要求该场景必须做复制消除,两种写法的语义完全等价。
仅有的差异是语法规则层面的:如果类的构造函数被声明为explicit,或者复制/移动构造函数被删除,写法(2)可能编译失败,写法(1)可以正常编译,这和性能无关。
关于编译器优化的问题
对于你举的内置类型例子,不需要任何优化等级,所有编译器的实现就已经完全一致;对于自定义类型场景,哪怕是十余年前的老编译器(GCC 4.x、MSVC 2010及以上)都会默认做复制消除优化,生成和写法(1)完全一致的底层实现,现代编译器更是不存在例外。
内容的提问来源于stack exchange,提问作者Random
相关产品推荐
相关产品推荐

