直到今天,我一直认为正确的编译器会自动将struct pass-by-value转换为pass-by-reference,如果struct足够大,后者会更快.据我所知,这似乎是一个简单的优化.然而,为了满足我对这是否真的发生的好奇心,我在C++和D中创建了一个简单的测试用例,并查看了GCC和Digital Mars D的输出.两者都坚持按值传递32字节结构有问题的函数是添加成员并返回值,没有修改传入的结构.C++版本如下.
#include "iostream.h"
struct S {
int i, j, k, l, m, n, o, p;
};
int foo(S s) {
return s.i + s.j + s.k + s.l + s.m + s.n + s.o + s.p;
}
int main() {
S s;
int bar = foo(s);
cout << bar;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么这样的东西不会被编译器优化为传递引用而不是实际将所有这些推int送到堆栈上?
注意:使用的编译器开关:GCC -O2(-O3内联foo().),DMD -O -inline -release.
编辑:显然,在一般情况下,传值和传递引用的语义将不相同,例如,如果涉及复制构造函数或在被调用者中修改原始结构.但是,在许多现实场景中,语义在可观察行为方面是相同的.这些是我要问的案例.
compiler-construction optimization performance assembly struct
好吧,我是初学者,这是我作为计算机科学专业的一年.我正在尝试从我的教科书中进行练习,我使用了一个名为struct的结构MovieData,它有一个构造函数,允许我在MovieData
创建结构时初始化成员变量.这是我的代码的样子:
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
// struct called MovieData
struct MovieData
{
string title;
string director;
unsigned year;
unsigned running_time;
double production_cost;
double first_year_revenue;
MovieData() // default constructor
{
title = "Title";
director = "Director";
year = 2009;
running_time = 90;
production_cost = 1000000.00;
first_year_revenue = 1000000.00;
}
// Constructor with arguments:
MovieData(string t, string d, unsigned y, unsigned r, double p, double f)
{
title = t;
director = d; …Run Code Online (Sandbox Code Playgroud)