编译器会优化返回固定大小数组的结构的函数吗?

t

假设我struct在C / C ++中具有固定大小的数组成员,例如:

#define SIZE 10000
struct foo{
  int vector_i[SIZE];
  float vector_f[SIZE];
};

并且我想创建一个函数,该函数将返回的实例foo,例如:

foo func(int value_i, float value_f){
  int i;
  foo f;
  for(i=0;i<SIZE;i++) f.vector_i[i] = value_i;
  for(i=0;i<SIZE;i++) f.vector_f[i] = value_f;
  return f;
}

如果我使用以下函数调用该函数:

foo ff = func(1,1.1);

编译器会执行某种优化(即TCO)吗?

请问可执行填充直接ff变量,或者它会先填ffunc,然后从复制的所有值fff

如何检查优化是否已执行?

埃雷里卡

我的答案适用于c ++。

编译器会执行某种优化(即TCO)吗?

TCO是指“尾部呼叫优化”吗?该函数不会在最后进行函数调用(如果愿意,则可以进行尾部调用),因此优化不适用。

编译器可以 的Elid从返回值拷贝到临时因命名返回值优化。也可以取消临时副本的复制初始化。


如何检查优化是否已执行?

通过读取生成的汇编代码。

如果您无法阅读汇编,则另一种方法是添加具有副作用的复制并移动构造函数,并观察这些副作用是否发生。但是,修改程序可能会影响编译器是否决定进行优化(但是不需要副作用以防止复制遗漏)。


如果您不想依赖优化,则应通过引用(c中的指针)将传递的对象显式传递给函数,然后就地对其进行修改。


复制省略的标准参考[class.copy]§31(当前标准草案)

当满足某些条件时,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有副作用,也允许实现忽略类对象的复制/移动构造。[...]

本节介绍了在这种情况下要满足的条件。引用来自于2016-04-07的标准文档草案。编号可能因标准文档的不同版本而异,并且规则略有更改。自c ++ 03起,引用的部分一直未更改,该部分的内容为[class.copy]§15。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

编译器会优化返回固定大小数组的结构的函数吗?

来自分类Dev

我可以让编译器优化结构中的函数调用吗?

来自分类Dev

C#编译器会优化此代码吗?

来自分类Dev

编译器会优化未使用的链接文件吗?

来自分类Dev

编译器会优化集合初始化吗?

来自分类Dev

编译器会优化除法乘法吗

来自分类Dev

编译器会偷偷增加结构的对齐吗?

来自分类Dev

编译器可以优化汇编中的函数序言吗?

来自分类Dev

编译器可以优化多个相同的函数调用吗

来自分类Dev

Java编译器会优化基于静态变量进行条件化的静态函数吗?

来自分类Dev

编译器会自动创建返回变量吗?

来自分类Dev

编译器会优化条件中的双重逻辑否定吗?

来自分类Dev

手动分配地址时,编译器会优化函数的指针

来自分类Dev

Java编译器会汇编吗?

来自分类Dev

函数返回类型返回结构指针的编译器抛出错误

来自分类Dev

为什么编译器优化会破坏我的代码?

来自分类Dev

编译器会忽略显式定义的move构造函数吗?

来自分类Dev

Java编译器警告会影响编译时间吗?

来自分类Dev

Java编译器警告会影响编译时间吗?

来自分类Dev

C ++编译器优化可以在范围结束之前清除未使用的数据结构吗?

来自分类Dev

C#编译器会优化循环内对同一方法的调用吗?

来自分类Dev

我可以得到编译器应用的优化日志吗?

来自分类Dev

C#编译器不会优化foreach吗?

来自分类Dev

编译器可以优化字符串上的ToString()吗?

来自分类Dev

这是C#编译器完成的优化吗?

来自分类Dev

编译器可以优化dynamic_cast吗?

来自分类Dev

模板布尔会被编译器优化吗?

来自分类Dev

编译器可以优化此代码段吗?

来自分类Dev

编译器可以优化字符串上的ToString()吗?

Related 相关文章

  1. 1

    编译器会优化返回固定大小数组的结构的函数吗?

  2. 2

    我可以让编译器优化结构中的函数调用吗?

  3. 3

    C#编译器会优化此代码吗?

  4. 4

    编译器会优化未使用的链接文件吗?

  5. 5

    编译器会优化集合初始化吗?

  6. 6

    编译器会优化除法乘法吗

  7. 7

    编译器会偷偷增加结构的对齐吗?

  8. 8

    编译器可以优化汇编中的函数序言吗?

  9. 9

    编译器可以优化多个相同的函数调用吗

  10. 10

    Java编译器会优化基于静态变量进行条件化的静态函数吗?

  11. 11

    编译器会自动创建返回变量吗?

  12. 12

    编译器会优化条件中的双重逻辑否定吗?

  13. 13

    手动分配地址时,编译器会优化函数的指针

  14. 14

    Java编译器会汇编吗?

  15. 15

    函数返回类型返回结构指针的编译器抛出错误

  16. 16

    为什么编译器优化会破坏我的代码?

  17. 17

    编译器会忽略显式定义的move构造函数吗?

  18. 18

    Java编译器警告会影响编译时间吗?

  19. 19

    Java编译器警告会影响编译时间吗?

  20. 20

    C ++编译器优化可以在范围结束之前清除未使用的数据结构吗?

  21. 21

    C#编译器会优化循环内对同一方法的调用吗?

  22. 22

    我可以得到编译器应用的优化日志吗?

  23. 23

    C#编译器不会优化foreach吗?

  24. 24

    编译器可以优化字符串上的ToString()吗?

  25. 25

    这是C#编译器完成的优化吗?

  26. 26

    编译器可以优化dynamic_cast吗?

  27. 27

    模板布尔会被编译器优化吗?

  28. 28

    编译器可以优化此代码段吗?

  29. 29

    编译器可以优化字符串上的ToString()吗?

热门标签

归档