Sha*_*ane 7 c++ gcc clang visual-c++ c++11
在C++ 11标准中,有一个关于支持统一初始化的数组的说明,其中指出:
如果可以如此分配具有相同初始化程序的显式数组,则实现可以在只读存储器中自由分配数组.
GCC/Clang/VS会利用这个吗?或者使用此功能的每个初始化是否受到堆栈上的其他数据的影响,以及此隐藏阵列的额外初始化时间?
例如,给出以下示例:
void function()
{
std::vector<std::string> values = { "First", "Second" };
...
Run Code Online (Sandbox Code Playgroud)
上面提到的每个编译器是否将后备数组存储在与声明的变量相同的内存中的统一初始化中static const?当调用函数或应用程序初始化时,每个编译器是否会初始化后备数组?(我不是在谈论std::initializer_list<std::string>将要创建的,而是它所指的"隐藏数组".
Mar*_* Ba -2
首先:VC++,从版本 VS11=VS2012 开始,其初始版本不支持初始化列表,所以这个问题对于 VS atm 来说有点没有意义。但我确信他们会修补这个问题,它应该变成几个月(或几年)内相关。
作为附加信息,我将添加 VS 2012 对本地数组初始化所做的操作,每个人都可以得出自己的结论,这对于他们实现初始化列表时意味着什么:
release mode以下是 VC++2012 在编译器默认情况下输出的内置数组的初始化:
int _tmain(int argc, _TCHAR* argv[])
{
00B91002 in al,dx
00B91003 sub esp,28h
00B91006 mov eax,dword ptr ds:[00B94018h]
00B9100B xor eax,ebp
00B9100D mov dword ptr [ebp-4],eax
00B91010 push esi
int numbers[] = {1,2,3,4,5,6,7,8,9};
00B91011 mov dword ptr [numbers],1
00B91018 mov dword ptr [ebp-24h],2
00B9101F mov dword ptr [ebp-20h],3
00B91026 mov dword ptr [ebp-1Ch],4
00B9102D mov dword ptr [ebp-18h],5
00B91034 mov dword ptr [ebp-14h],6
00B9103B mov dword ptr [ebp-10h],7
00B91042 mov dword ptr [ebp-0Ch],8
00B91049 mov dword ptr [ebp-8],9
...
Run Code Online (Sandbox Code Playgroud)
因此,该数组是在函数执行时创建/填充的,因此不涉及“静态”存储。