Laz*_*gre 0 c++ compilation c++11
几年前我读到使用{}和{0}来初始化POD在c ++中有一些细微的差别,其中一个可以在你的代码中引入悲观化.
D3D11_TEXTURE2D_DESC dsd = {};
D3D11_TEXTURE2D_DESC dsd2 = { 0 }:
Run Code Online (Sandbox Code Playgroud)
虽然我知道{0}肯定是从c继承而且{}是在c ++ 11中引入的东西,但两者都应该在编译期间被翻译成同一个memset()调用:
memset(&dsd, 0, sizeof(dsd));
Run Code Online (Sandbox Code Playgroud)
然而,2个大括号初始化样式中的一个做了内存初始化未对齐的事情,是否有人关心哪个样式更好以及为什么?
您引用的语法称为聚合初始化.
如果初始化程序子句的数量小于成员数或初始化程序列表完全为空,则其余成员将进行值初始化
由于POD的值初始化与零初始化相同,因此您显示的两种语法之间没有区别.
甚至在C++ 11之前就是这种情况 - 空的初始化列表不是它引入的东西.从C++ 11开始,非POD也允许使用语法.聚合初始化现在是此新列表初始化的特例.