以下代码在ubuntu clang ++ 3.6 / g ++ 4.8.2中运行良好。我想知道为什么此代码可以编译(使用-std = c ++ 14 / c ++ 11)并打印出正确的结果“ 4”。据我了解,* pi的值只能在运行时计算,而数组的长度需要在编译时计算,对吗?
constexpr int foo(int i,int j)
{
return i+j;
}
int bar(int *p)
{
int i=pow(2,*p);
return i;
}
int main()
{
int *pi = new int;
*pi = 1;
*pi = bar(pi);
int arr3[foo(*pi,*pi)]; // the length of array need to be calculated in compile time
cout<<sizeof(arr3)/sizeof(arr3[0])<<endl;
}
它是在运行时计算的。
int arr3[expr]
在编译时不需要已知的大小值。因此,问题在于,如果不进行优化,则会g++
将数组大小保存在局部变量中,而如果进行优化,则会执行一些静态分析。这就是它sizeof
在运行时知道的方式。
例如:
#include <stdio.h>
int main()
{
int i;
scanf("%d", &i);
int arr3[i];
printf("%d\n", sizeof(arr3));
}
生成以下程序集片段(g++ -S -O3
)
movl -4(%rbp), %esi
shlq $2, %rsi
leaq L_.str1(%rip), %rdi
xorl %eax, %eax
callq _printf
的值i
存储在中-4(%rbp)
。
一般来说constexpr
,与此问题无关。就像@MarcGlisse指出的那样,可变长度数组也不是标准的一部分,而实际上是g++
扩展。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句