developer tip

const-correctness가 성능을 향상시킬 수 있습니까?

copycodes 2020. 10. 17. 10:40
반응형

const-correctness가 성능을 향상시킬 수 있습니까?


저는 C 또는 C ++ 코드에서 const-correctness를 적용하는 것이 유지 관리 측면에서 좋은 방법 일뿐만 아니라 컴파일러가 최적화를 수행 할 수 있도록 허용 할 수 있다는 것을 여러 번 읽었습니다. 그러나 나는 완전히 반대의 내용도 읽었습니다. 성능에 전혀 영향을주지 않습니다.

따라서 const 정확성이 프로그램의 성능을 향상시키는 데 컴파일러에 도움이 될 수있는 예가 있습니까?


const때문에 정확성은 성능을 개선 할 수 const_castmutable언어, 그리고 일치되게 규칙을 깰 코드를 할 수 있습니다. 이것은 C ++ 11에서 더욱 악화됩니다. const예를 들어 데이터가에 대한 포인터 일 수 있습니다 std::atomic. 즉, 컴파일러는 다른 스레드에 의해 변경된 내용을 존중해야합니다.

즉, 컴파일러가 생성하는 코드를보고 주어진 변수에 실제로 쓰는지 확인하고 그에 따라 최적화를 적용하는 것은 간단합니다.

즉, const정확성은 유지 관리 측면에서 좋은 것입니다. 그렇지 않으면 클래스의 클라이언트가 해당 클래스의 내부 멤버를 손상시킬 수 있습니다. 예를 들어 표준을 고려하십시오 std::string::c_str(). const 값을 반환 할 수 없다면 문자열의 내부 버퍼를 사용할 수 있습니다!

const성능상의 이유로 사용하지 마십시오 . 유지 관리를 위해 사용하십시오.


예, 그럴 수 있습니다.

대부분 const의는 순전히 프로그래머의 이익을위한 것이며 컴파일러가 최적화하는 데 도움이되지 않습니다. 캐스트하는 것이 합법적이며 최적화에 유용한 것을 컴파일러에 알리지 않기 때문입니다. 그러나 일부 const는 (법적으로) 캐스트 할 수 없으며 최적화에 유용한 정보를 컴파일러에 제공합니다.

예를 들어 const유형으로 정의 된 전역 변수에 대한 액세스 는 인라인 될 수 있지만 const유형이없는 변수 는 런타임에 변경 될 수 있으므로 인라인 될 수 없습니다.

https://godbolt.org/g/UEX4NB

C ++ :

int foo1 = 1;
const int foo2 = 2;

int get_foo1() {
    return foo1;
}

int get_foo2() {
    return foo2;
}

asm :

foo1:
        .long   1
foo2:
        .long   2
get_foo1():
        push    rbp
        mov     rbp, rsp
        mov     eax, DWORD PTR foo1[rip] ; foo1 must be accessed by address
        pop     rbp
        ret
get_foo2():
        push    rbp
        mov     rbp, rsp
        mov     eax, 2 ; foo2 has been replaced with an immediate 2
        pop     rbp
        ret

실제적으로 const는 성능을 향상시킬 수 있지만 대부분의 경우 그렇지 않을 수도 있지만 변경 사항이 눈에 띄지 않을 것입니다. 의 주요 유용성은 const최적화가 아닙니다.


Steve Jessop gives another example in his comment on the original question which brings up something worth mentioning. In a block scope, it's possible for a compiler to deduce if a variable will be mutated and optimize accordingly, regardless of const, because the compiler can see all uses of the variable. In contrast, in the example above, it's impossible to predict if foo1 will be mutated since it could be modified in other translation units. I suppose a hypothetical sentient ultra-compiler could analyze an entire program and determine if it's valid to inline access to foo1... but real compilers can't.


in my experience, no

For scalar variables, compiler is able to determine whenever the value is changed and perform necessary optimization itself.

For array pointers, const correctness is no guarantee that values are really constant in presence of potential aliasing problems. Hence compiler can not use const modifier alone to perform optimizations

if you are looking optimization, you should consider __restrict__ or special function modifiers/attributes: http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html


A bit old, but still applies: http://www.gotw.ca/gotw/081.htm And some more: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

참고URL : https://stackoverflow.com/questions/3435026/can-const-correctness-improve-performance

반응형