C如何高效初始化数组文章目录C如何高效初始化数组问题解决方案1 .使用ON-O3优化级C 17的constexpr进行编译期计算3 .使用模板元编程中的奇技巧进行汇总补充
问题
如果数组长度固定,则尝试将非const数组初始化为0时,通常会出现以下情况:
int a[]{0}; 要将数组初始化为特定值,通常使用以下方法:
inta [ ] { 1,2,3,4,5,6 }; 但是,{}存在以下问题。
更改数组的长度意味着要重写这一行的代码,如果数组的长度很长,就会很麻烦。 初始化斐波那契数列等复杂的运算很难实现。 解决方案1 .不详细论述ON-O3优化级别。
使用C 17的constexpr进行编译期间的计算以下是使用{}、constexpr和运行时for循环的结果的比较。
{}优化级别- 0
int main () inta[10] ) 0、1、2、3、4、5、6、7、8、9 ); return a[1]; }组件如下:
main: push rbp mov rbp、rsp mov DWORD PTR [rbp-48]、0 mov DWORD PTR [rbp-44]、1 mov DWORD PTR [rbp-40]、 2 movdwordptr [2movdwordptr ]3mov dword ptr [ RBP-32 ]、4 mov DWORD PTR [rbp-28]、5 mov DWORD PTR [rbp-24]和6 mov dword ptr 7 movdwordptr [7]8mov dword ptr [ RBP-12 ],9 mov eax,dword ptr [ RBP-44 ] poprbpretconstexpr函数,优化级别-O0
# includearrayconstexprautocreatearray ((STD :3360 array int,10 result{} ); for(intI=0; i 10; I ) { result[i]=i; } return result; }int main () { auto a=CreateArray ); return a[1]; }组件如下:
main: push rbp mov rbp、rsp sub rsp、48 mov DWORD PTR [rbp-48]、0 mov DWORD PTR [rbp-44]、1 mov DWORD PTR [rbp-40]和2 mov 4 mov DWORD PTR [rbp-28]、5 mov DWORD PTR [rbp-24]、6 mov DWORD PTR [rbp-20]和7 movdwordptr [7]8mov dword ptr [ RBP-12 ] 1 mov rdi、rax call std:arrayint、10ul33603360operator[此外,在O1 O2级别也可以获得与{}相同的优化。 (我自己试试,但我不会给你看。
普通选手。
int main () ) { int a[10]; for(intI=0; i 10; I ) a(I )=I; return a[1]; }即使将优化设为-O2,也仍然不进行循环展开,在jmp上浪费时间。
main: xor eax,eax.l 2: movdwordptr [ RSP-48 rax *4],eax add rax,1 cmp rax,10 jne .L2 mov eax,DWORDptr[RSP-44]
总的来说能说什么,世界上最好的语言是谁,这个还不清楚吗?
对此进行补充的只有C 17有效,C 11无法编译。 C 14没有优化constexpr中的循环。