2012-04-27 3 views
3

__attribute__ ((__packed__))휴대용 __attribute__ ((__packed__))

의 휴대용 등가 있는가 (I는 PC, 안드로이드 아이폰 작업 의미 휴대하여 관계없이 아키텍처)

+3

간단한 답 : 아니오. – bmargulies

+0

@bmargulies : 실제로, C++ 11의'alignas'는 그다지 간단하지 않습니다. – KillianDS

+0

오, 그래. 내가 그런 식으로 무서워서 의견으로 남겼습니다. – bmargulies

답변

4

정의상, __attribute__은 휴대 할 수 없습니다. 당신이 당신의 데이터를 특정 방법을 원하는 경우, Plan9 솔루션은 구조 unsigned char 배열을 사용하는 것이 있습니다 :

struct foo { 
    uchar data1[4]; 
    uchar other[2]; 
} 

보통은 기본적으로 서명되지 않은 문자를 사용하고 있기 때문에, 어떤 정렬 할 수 없습니다. 통증에 대한 높은 내성이있는 경우 물론, 당신은 항상 오프셋의 enum을 사용할 수

enum { FOO_DATA1=0, FOO_OTHER=4, FOO_LAST=6 }; 

당신은 다음과 같이 그것을로드 할 수 :

unsigned char foo[FOO_LAST]; 
uint32_t n = htonl(val) 
memcpy(foo+FOO_DATA1, &n, sizeof n) 
memcpy(foo+FOO_OTHER, &some_16_bit_val, sizeof some_16_bit_val) 

을만큼 당신이이로 그것에 대한 위장, 그것은 완전히 휴대용 것입니다.

+0

고마워, 나는 실제로 첫번째 해결책을 목표로 삼고 있었다. Plan9에 대해 구체적으로 알지 못했습니다. –

1

호 구조 패킹 및 패딩 파트 아니다 C++ 언어 사양 (플랫폼 ABI에 속함)이므로 언어를 다루는 모든 것이 본질적으로 언어 외부에 있습니다.

+0

심지어 정렬은 플랫폼 ABI와 관련이 있으며 이제는 표준의 일부입니다. 패킹은 가난한 이유로 표준에서 벗어난 또 다른 물건이며 컴파일러 개발자는 기본적으로 비표준 확장을 추가해야합니다. – ceztko

관련 문제