수색…


소개

컴파일 할 때 컴파일러는 종종 프로그램을 수정하여 성능을 향상시킵니다. 이는 관찰 가능한 동작을 변경하지 않는 모든 변환을 허용하는 as-if 규칙에 의해 허용됩니다.

인라인 확장 / 인라인

인라인 확장 (인라인이라고도 함)은 함수 호출을 해당 함수의 본문으로 바꾸는 컴파일러 최적화입니다. 이렇게하면 함수 호출 오버 헤드가 절약되지만 함수가 여러 번 복제 될 수 있기 때문에 공간을 절약 할 수 있습니다.

// source:

int process(int value)
{
    return 2 * value;
}

int foo(int a)
{
    return process(a);
}

// program, after inlining:

int foo(int a)
{
    return 2 * a; // the body of process() is copied into foo()
}

인라이닝은 함수 호출 오버 헤드가 함수 본문 크기에 비해 중요한 작은 함수에 대해 가장 일반적으로 수행됩니다.

빈 기본 최적화

유형이 빈 class 유형 (즉, 정적이 아닌 데이터 멤버가없는 class 또는 struct 경우에도 객체 또는 멤버 하위 객체의 크기는 적어도 1이어야합니다. 동일한 유형의 구별되는 오브젝트의 주소는 항상 구별됩니다.

그러나 기본 class 하위 객체는 너무 제한되어 있지 않으며 객체 레이아웃에서 완전히 최적화 할 수 있습니다.

#include <cassert>

struct Base {}; // empty class

struct Derived1 : Base {
    int i;
};

int main() {
    // the size of any object of empty class type is at least 1
    assert(sizeof(Base) == 1);

    // empty base optimization applies
    assert(sizeof(Derived1) == sizeof(int));
}

빈 기본 최적화는 allocator-aware 표준 라이브러리 클래스 ( std::vector , std::function , std::shared_ptr 등)가 allocator가 stateless 인 경우 할당 자 멤버에 대한 추가 저장 공간을 차지하지 않도록 일반적으로 사용됩니다. 이는 필요한 데이터 멤버 중 하나 (예 : vector begin , end 또는 capacity 포인터) 중 하나를 저장하여 수행됩니다.

참조 : cppreference



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow