패딩 효과를 줄이기 위해 구조체의 필드를 수동으로 다시 정렬하는 데 몇 분을 소비했습니다. [1], 이는 몇 분 정도 지나치게 느껴집니다. 나의 직감은 내 시간이 나를 위해 이런 종류의 최적화를 할 펄 스크립트 또는 기타 등등을 쓰는 것이 더 나을 수도 있다고 말한다.패딩을 피하기 위해 C 구조체의 자동 필드 재정렬
제 질문은이 역시 중복되는지 여부입니다. 이미 알고있는 일부 도구, 또는 구조체를 팩하기 위해 [2]를 켤 수 있어야하는 일부 컴파일러 기능이 있습니까?
이 문제는 몇 가지 아키텍처에서 일관되게 최적화해야하므로 더 복잡한 구조이므로 정렬 도구와 포인터 크기를 고려해야합니다.
EDIT : 빠른 설명 - 패딩을 피하기 위해 소스 코드의 필드를 재정렬하고, 패딩없이 컴파일하는 것처럼 구조체를 "팩하지"않습니다.
EDIT # 2 : 또 다른 복잡함 : 구성에 따라 일부 데이터 유형의 크기가 변경 될 수도 있습니다. 명백한 것들은 다른 아키텍처에 대한 포인터와 포인터 차이뿐 아니라 부동 소수점 유형 ('정확도'에 따라 16, 32 또는 64 비트), 체크섬 ('속도'에 따라 8 또는 16 비트) 및 일부 다른 명백하지 않은 것들.
[1]에 해당 구조체가 인스턴스화되고 임베디드 장치에 천배하므로 구조체의 각 4 바이트 감소는 차이점은이 프로젝트 않음 - 이동 및 이동 없음을 의미 할 수있다.
[2] 사용 가능한 컴파일러는 GCC 3. * 및 4. *, Visual Studio, TCC, ARM ADS 1.2, RVCT 3 * 및 기타 다소 모호합니다.
이 구조체의 필요의 인스턴스로 수행 장치간에 이식 가능하거나 각 아키텍처가 자체 포장을 가지고 있어도 괜찮습니까? – Alnitak
그냥 옆으로 : 나는 이것이 흥미로운 문제라고 생각하고 "perl struct reordering"을 검색했습니다. 이것이 최고의 결과였습니다. 질문은 불과 15 분입니다! –
Alnitak - 그렇습니다. 실제로 이식성이 있어야하는 코드입니다. 각 아키텍처마다 고유 한 구조체 정의가있는 것이 좋지만 직접 아키텍처 고유의 정의를 작성하는 것은 비현실적입니다. – Christoffer