C에서 값 최적화 및 복사 항목 반환
C의 값으로 구조물을 통과시키고 반환할 수 있다는 것을 모르는 사람도 있습니다.C에서 구조물을 반환할 때 컴파일러가 불필요한 복사를 하는 것에 대한 질문입니다.GCC 등의 C 컴파일러는 Return Value Optimization(RVO; 반환값 최적화)을 사용하고 있습니까, 아니면 C++만의 개념입니까?RVO 및 복사 삭제에 대해 읽은 내용은 모두 C++에 관한 것입니다.
예를 들어보자.현재 C에 더블 더블 데이터 타입을 실장하고 있습니다(유닛 테스트가 간단하기 때문에 플로트 플로트라고 하는 것이 좋습니다).다음 코드를 고려합니다.
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
반환할 값 또는 임시 복사본이 삭제될 수 있습니까?
C의 Named Return Value Optimization(NRVO; 이름 있는 반환값 최적화)은 어떻습니까?다른 기능이 있습니다.
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를 사용합니다).컴파일러의 기능을 확인하기 위해 어셈블리 출력을 볼 수 있다는 것은 알고 있지만, 그래도 흥미로운 질문이라고 생각합니다.
RVO/NRVO는 C의 "as-if" 규칙에서 명확하게 허용됩니다.
C++에서는 생성자, 소멸자 및/또는 할당 연산자를 오버로드하여 이러한 부작용을 얻을 수 있지만(예를 들어, 이러한 연산자 중 하나가 발생했을 때 무언가를 출력합니다), C에서는 이러한 연산자를 오버로드할 수 없으며 기본 제공 연산자는 관찰할 수 없는 부작용을 얻을 수 없습니다.
오버로드하지 않으면 복사 삭제로 인한 현저한 부작용이 없기 때문에 컴파일러가 이를 실행하는 것을 막을 수 없습니다.
C++에서 RVO가 많이 다뤄지는 이유는 C++에서 RVO에 부작용이 있기 때문입니다(즉, 임시 객체의 소멸자나 결과 객체의 복사 생성자 또는 할당 연산자를 호출하지 않습니다).
C에서는 가능한 부작용은 없고 잠재적인 성능 향상만 있습니다.일부 컴파일러가 이러한 최적화를 수행하지 못할 이유는 없습니다.적어도 기준에서 그것을 금지하는 것은 없다.
어쨌든 최적화는 컴파일러와 최적화 수준에 의존하기 때문에 사용하는 컴파일러가 잘 정의되어 있고 변경되지 않을 것으로 예상되지 않는 한 중요한 코드 패스에 대해서는 기대하지 않습니다.
언급URL : https://stackoverflow.com/questions/30034171/return-value-optimization-and-copy-elision-in-c
'programing' 카테고리의 다른 글
NoClassDefFoundError: 안드로이드.support.v7.internal.view.메뉴판메뉴빌더 (0) | 2022.08.19 |
---|---|
NPM에서 Vuejs 컴포넌트를 만들고 게시하는 방법 (0) | 2022.08.19 |
Laravel 리소스 경로를 Axios에서 삭제 (0) | 2022.08.19 |
Vue.js를 사용하여 대체 버튼을 클릭하여 대체 약품을 사용하고 싶다. (0) | 2022.08.19 |
v-for 항목 내부 전환은 전체 목록에 영향을 미치는데, 각 전환이 포함된 목록 항목에만 영향을 미치도록 하려면 어떻게 해야 합니까? (0) | 2022.08.19 |