2012-02-14 2 views
0

나는 내부적으로 만 배열로 구성하는 클래스, 예를 들어 있습니다단일 배열을 포함하는 struct를 packed로 선언 할 때 단점이 있습니까?

다른 곳
class foo { 
public: 
    // methods 
private: 
    int myarray[10]; 
}; 

내가 가지고 foo를 포함하는 포장 구조체 (GCC 확장) :

struct __attribute__((__packed__)) bar { 
    foo x; 
}; 

을하지만, GCC는 '불평 foo '는 압축되지 않으므로 막대가 압축되지 않습니다. 이제 foo를 압축하면 GCC의 오류가 사라집니다. 나는 packed 구조체 내부에있는 것 이외의 다른 문맥에서 foo를 사용하려고합니다. 그래서 지금은 foo, Foo 및 PackedFoo의 두 가지 버전이 있습니다. 그러나, 그들은 단지 배열을 포함하고 AFAIK는 C++에서 'unpacked array'와 같은 것이 없기 때문에, Foo를 가지고 포장 된 속성을주는 것은 나에게 어떤 해가 되는가? 그것은 어떻게 든 포장 된 구조체 외부에서 Foo를 사용할 때 생성되는 GCC 코드를 느리게할까요?

+2

왜'bar' 포장을 중단하지 않으시겠습니까? 그게 가장 간단한 해결책 인 것 같습니다. –

+0

철사 형식을 구문 분석하기 위해 막대를 사용하고 있습니다. –

+1

그러면 포함 된 모든 것을 포장해야합니다! –

답변

1

구조체에 int (또는 int 배열) 만있는 경우 패킹하는 것이 적합하지 않습니다. 나는 그것이 무해하다고 기대할 것이다.

마찬가지로 foobar에있는 경우 무의미합니다. 나는 당신이 그 내용의 나머지 부분을 단순히 생략했다고 생각하니?

어쨌든, 귀하의 질문에 대한 답변은 포장 된 구조체 (포장 한 경우 효과가 있음)가 일 때 일 때 프로그램이 느리게 실행됩니다. 그렇지 않다면 '언 패킹 된'구조체가 필요하지 않습니다. 그것은 프로그램의 성능에 중대한 부분이 아니라면 해가되지 않을 수도 있습니다.

당신은 섞여서 일치시킬 수 없습니다. 한 곳에서 포장 된 구조체에 액세스 할 수없고 다른 곳에서 포장을 풀 수 없습니다. 그건 그냥 작동하지 않습니다.

응용 프로그램 API 또는 네트워킹에 포장 된 구조체를 사용하는 것이 안전하지 않은 경우에도 안전하지 않습니다. 패킹 된 구조체의 레이아웃은 일반적으로 예측 가능하지만 표준화되지 않았습니다.

+0

사실 일반적으로 모두 예측 가능하지만 포장 된 구조체와 압축되지 않은 구조체의 레이아웃은 표준화되어 있습니다. –

+0

@Rob 구조체 레이아웃은 매개 변수 전달 규칙 및 바이너리 호환을 위해 필요한 다른 모든 gubbins와 함께 ABI에서 정의합니다. 그것이 없다면 큰 문제가 될 것입니다. 물론, 일부 ABI가 포장 된 구조체 레이아웃을 정의 할 수도 있습니다 (가능성 있음). 그러나 플랫폼 독립적 인 코드에서는이 구조체를 사용하지 않을 것입니다. – ams

+0

구조체의 레이아웃이 (반드시 platform- * dependent *) ABI에 의해 정의 된 경우 platform- * independent * 코드에서 의존해서는 안됩니다. 패킹되거나 패킹되지 않은 구조체의 레이아웃은 모든 플랫폼 독립적 인 표준에서 정의됩니다. –

관련 문제