Некоторые люди не знают, что это possible to pass and return structs by value in C. Мой вопрос в том, что компилятор делает ненужные копии при возврате структур в компиляторах C. Do C, таких как GCC, использует оптимизацию Return value optimization(RVO) или это только концепция C++? Все, что я прочитал о RVO и копировании elision, относится к C++.Оптимизация возвращаемого значения и копирование в C
Рассмотрим пример. В настоящее время я внедряю double-double data type в C (или, скорее, float-float для начала, потому что я нахожу это легко для модульного теста). Рассмотрим следующий код.
typedef struct {
float hi;
float lo;
} doublefloat;
doublefloat quick_two_sum(float a, float b) {
float s = a + b;
float e = b - (s - a);
return (doublefloat){s, e};
}
Будет ли компилятор сделать временную копию значения doublefloat
я вернуть или может временная копия быть опущены?
Что такое оптимизация значений имен (NRVO) в C? У меня есть другая функция
doublefloat df64_add(doublefloat a, doublefloat b) {
doublefloat s, t;
s = two_sum(a.hi, b.hi);
t = two_sum(a.lo, b.lo);
s.lo += t.hi;
s = quick_two_sum(s.hi, s.lo);
s.lo += t.lo;
s = quick_two_sum(s.hi, s.lo);
return s;
}
В этом случае я возвращаю названную структуру. Может ли временная копия в этом случае быть отменена?
Следует отметить, что это общий вопрос для C и что примеры кода, которые я использовал здесь, являются только примерами (когда я оптимизирую это, я буду использовать SIMD с intrinsics в любом случае). Я знаю, что я мог бы посмотреть на сборку, чтобы увидеть, что делает компилятор, но я думаю, что это интересный вопрос.
@BaummitAugen, я тоже не был уверен, следует ли использовать тег C++. Но я думаю, что я ясно дал понять в своем вопросе, что речь идет о C. Я надеялся, что тег C++ привлечет людей, которые являются экспертами на обоих языках. –
@BaummitAugen есть такая концепция в C вообще. Я удалил тег 'C', поскольку он кажется мне лишним. –
@IvayloStrandjev все еще вопрос о C, тег относится к вопросу, нет? – BeyelerStudios