为什么constexpr函数可以与在运行时生成的变量一起很好地工作?

卡米诺

以下代码在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

为什么不能在运行时安全地生成fmt :: Arguments?

来自分类Dev

为什么不能在运行时安全地生成fmt :: Arguments?

来自分类Dev

函数重载在运行时如何工作?为什么重载?

来自分类Dev

函数重载在运行时如何工作,为什么会重载?

来自分类Dev

为什么在运行时处理虚函数?

来自分类Dev

为什么在运行时而不是在编译时评估使用constexpr初始化变量

来自分类Dev

Catel是否可以与WPF导航应用程序一起很好地工作

来自分类Dev

如何与Dependency Injection框架一起处理在运行时创建的对象?

来自分类Dev

在运行时更新与Prism一起使用的DLL多数民众赞成

来自分类Dev

为什么在与Django一起运行时,datetime.strptime会引发错误?

来自分类Dev

是否可以在运行时使用 Node.js 中的函数生成对象?

来自分类Dev

使用图形卡在运行时生成mipmap或将其与文件中的纹理一起加载会更快吗?

来自分类Dev

为什么模板允许constexpr函数成员与非constexpr构造函数一起使用?

来自分类Dev

为什么我的静态变量在运行时不对齐?

来自分类Dev

C ++是静态类型语言,为什么我们可以在运行时获取类型

来自分类Dev

javascript-为什么在运行时调用了声明的函数

来自分类Dev

相似的递归函数在运行时上有很大的差异。这是为什么?

来自分类Dev

如何在运行时生成函数?

来自分类Dev

as3commons在运行时生成函数调用

来自分类Dev

是否可以在运行时更改AngularJS变量的类型?

来自分类Dev

可以在运行时使用Javascript创建函数吗?

来自分类Dev

为什么我的代码在运行时给我一个stackdump错误?

来自分类Dev

为什么Java在运行时需要classpath

来自分类Dev

为什么会在运行时遇到问题?

来自分类Dev

为什么这个简单的strcat在运行时崩溃?

来自分类Dev

为什么在运行时未实现重载?

来自分类Dev

为什么 Android 视图值在运行时不同?

来自分类Dev

将IoC / DI容器与运行时相关的构造函数参数一起使用

来自分类Dev

为什么我可以在运行时通过 ClassName.__init__(self) 初始化另一个类来扩展一个类

Related 相关文章

  1. 1

    为什么不能在运行时安全地生成fmt :: Arguments?

  2. 2

    为什么不能在运行时安全地生成fmt :: Arguments?

  3. 3

    函数重载在运行时如何工作?为什么重载?

  4. 4

    函数重载在运行时如何工作,为什么会重载?

  5. 5

    为什么在运行时处理虚函数?

  6. 6

    为什么在运行时而不是在编译时评估使用constexpr初始化变量

  7. 7

    Catel是否可以与WPF导航应用程序一起很好地工作

  8. 8

    如何与Dependency Injection框架一起处理在运行时创建的对象?

  9. 9

    在运行时更新与Prism一起使用的DLL多数民众赞成

  10. 10

    为什么在与Django一起运行时,datetime.strptime会引发错误?

  11. 11

    是否可以在运行时使用 Node.js 中的函数生成对象?

  12. 12

    使用图形卡在运行时生成mipmap或将其与文件中的纹理一起加载会更快吗?

  13. 13

    为什么模板允许constexpr函数成员与非constexpr构造函数一起使用?

  14. 14

    为什么我的静态变量在运行时不对齐?

  15. 15

    C ++是静态类型语言,为什么我们可以在运行时获取类型

  16. 16

    javascript-为什么在运行时调用了声明的函数

  17. 17

    相似的递归函数在运行时上有很大的差异。这是为什么?

  18. 18

    如何在运行时生成函数?

  19. 19

    as3commons在运行时生成函数调用

  20. 20

    是否可以在运行时更改AngularJS变量的类型?

  21. 21

    可以在运行时使用Javascript创建函数吗?

  22. 22

    为什么我的代码在运行时给我一个stackdump错误?

  23. 23

    为什么Java在运行时需要classpath

  24. 24

    为什么会在运行时遇到问题?

  25. 25

    为什么这个简单的strcat在运行时崩溃?

  26. 26

    为什么在运行时未实现重载?

  27. 27

    为什么 Android 视图值在运行时不同?

  28. 28

    将IoC / DI容器与运行时相关的构造函数参数一起使用

  29. 29

    为什么我可以在运行时通过 ClassName.__init__(self) 初始化另一个类来扩展一个类

热门标签

归档