为什么 constexpr 函数可以很好地处理在 运行 时间内生成的变量?
why constexpr function works well with a variable which generated in running-time?
以下代码在clang++3.6/g++4.8.2中运行良好,ubuntu。我想知道为什么这段代码可以编译(使用 -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 , %rsi
leaq L_.str1(%rip), %rdi
xorl %eax, %eax
callq _printf
i
的值存储在-4(%rbp)
.
总的来说constexpr
与这个问题无关。同样正如@MarcGlisse 指出的那样,可变长度数组 不是标准的一部分,这实际上是一个g++
扩展。
以下代码在clang++3.6/g++4.8.2中运行良好,ubuntu。我想知道为什么这段代码可以编译(使用 -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 , %rsi
leaq L_.str1(%rip), %rdi
xorl %eax, %eax
callq _printf
i
的值存储在-4(%rbp)
.
总的来说constexpr
与这个问题无关。同样正如@MarcGlisse 指出的那样,可变长度数组 不是标准的一部分,这实际上是一个g++
扩展。