【发布时间】:2016-09-08 04:17:55
【问题描述】:
假设我在 C/C++ 中有一个 struct 具有固定大小的数组成员,例如:
#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变量,还是先填充func中的f,然后将所有值从f复制到ff?
如何检查优化是否执行?
【问题讨论】:
-
这是一个相当大的对象,需要保存为局部变量。如果我计算正确,应该是 625kb(在 32 位平台上),在 windows 上我认为每个线程堆栈可以达到 1mb
-
将指向结构的指针(或引用)作为参数传递,您根本不必担心。
-
您可以查看生成的汇编程序。在 C++ 中,您还可以定义一个复制构造函数并查看它是否被调用。
-
以下划线和大写字母开头的标识符被保留,在 C 中定义
_SIZE_将调用 未定义的行为。 -
如果您想查看已完成的优化,请编写一个最小的测试程序,然后从您的编译器获取汇编输出,并检查它以了解实际发生的情况。确实没有其他方法可以确定,优化不是标准化的(除了优化的代码必须表现得好像没有进行任何优化,除了未定义的行为,启用优化后事情会变得非常糟糕)。
标签: c++ c struct return-value return-value-optimization