programing

GCC가 구조를 최적화하지 않는 이유는 무엇입니까?

copysource 2022. 7. 21. 22:37
반응형

GCC가 구조를 최적화하지 않는 이유는 무엇입니까?

시스템은 메모리 내의 특정 포인트에 특정 프리미티브를 정렬할 것을 요구합니다(4의 배수인 바이트, 2의 배수인 바이트).물론 패딩에 낭비되는 공간을 최소화하도록 최적화할 수 있습니다.

궁금한 건 왜 GCC는 이 작업을 자동으로 하지 않는 거죠?보다 명확한 경험적 접근법(가장 큰 크기 요구 사항에서 가장 작은 변수까지 순서 변수)이 결여되어 있습니까?일부 코드는 해당 구조의 물리적 순서에 의존합니까(좋은 생각입니까?)?

GCC는 여러 면에서 초최적화 되어 있지만, 이것은 아니기 때문에, 비교적 쿨한 설명이 있을 것이라고 생각하고 있습니다(나는 그것을 의식하고 있지 않습니다.

gcc는 구조체의 요소를 정렬하지 않습니다.이는 C 표준을 위반하기 때문입니다.C99 표준 섹션 6.7.2.1은 다음과 같다.

구조 객체 내에서, 비비트 엘리드 멤버와 비트 엘리드가 존재하는 유닛은 선언된 순서대로 증가하는 주소를 가진다.

구조는 바이너리 파일 형식 및 네트워크 프로토콜의 패킹 순서를 나타내는 데 자주 사용됩니다.그렇게 하면 이건 부서질 거야.또한 컴파일러에 따라 최적화 방식이 달라져 양쪽에서 코드를 연결할 수 없습니다.이것은 단순히 실현가능하지 않다.

GCC는 소스코드에서 기계코드를 만드는 데 있어서 우리보다 더 똑똑하지만, 우리보다 구조를 재배치하는 데 있어서 더 똑똑하다면 떨릴 것입니다. 왜냐하면 파일에 쓸 수 있는 데이터이기 때문입니다.4글자로 시작하여 4바이트 정수를 갖는 구조체는 GCC가 구조부재를 재배치해야 한다고 결정한 다른 시스템에서 읽으면 무용지물입니다.

gcc SVN은 구조 재편성 최적화(-fipa-struct-reorg)를 갖추고 있지만 전체 프로그램 분석이 필요하며 현시점에서는 그다지 강력하지 않습니다.

C 컴파일러는 말씀하신 것처럼 정렬 문제가 있기 때문에 구조를 자동으로 패킹하지 않습니다.워드 바운더리가 아닌 액세스(대부분의 CPU에서는 32비트)는 x86에 큰 불이익을 주고 RISC 아키텍처에서 치명적인 트랩을 일으킵니다.

좋은 생각이라고는 할 수 없지만, 구조체의 구성원의 순서에 따라 코드를 작성할 수 있습니다.예를 들어, 해커로서 사람들은 종종 접근하고 싶은 특정 필드의 유형으로 구조물에 포인터를 던진 다음 포인터 산수를 사용하여 그곳에 도달합니다.이것은 매우 위험한 발상입니다만, 특히 C++에서는, 서드 파티 라이브러리의 클래스에 있는 경우, 공개 액세스 할 수 있는 것으로 선언되어 공개 캡슐화 되어 있지 않은 변수를 강제하기 위해서 사용되고 있습니다.멤버들을 재정렬하면 그건 완전히 깨질 거야.

최신 gcc 트렁크 또는 활성화 개발 중인 structure-reorg-branch를 사용해 보는 것이 좋습니다.

https://gcc.gnu.org/wiki/cauldron2015?action=AttachFile&do=view&target=Olga+Golovanevsky_+Memory+Layout+Optimizations+of+Structures+and+Objects.pdf

언급URL : https://stackoverflow.com/questions/118068/why-doesnt-gcc-optimize-structs

반응형