首页 > 编程知识 正文

c语言数组初始化为空,c语言二维数组初始化为0

时间:2023-05-05 11:03:31 阅读:109147 作者:1576

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中的循环。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。