2017-11-25 11 views
1

다음 코드 은 교차 컴파일 가능입니까? 즉메모리 정렬 보증

struct Foo { 
    alignas(1) char c1; 
    alignas(1) char c2; 
    alignas(4) int i; 
}; 
static_assert(sizeof(Foo) == (sizeof(int) + 4), "No cross-compilable"); 

, 그것은 어떤 아키텍처/플랫폼에 대한 sizeof(Foo) == (sizeof(int) + 4) 보장인가?

+0

엄밀히 말하면? 나는 말하지 않을 것이다. 정렬 지정이 패딩 옵션을 무효화한다고 생각하지 않습니다. – StoryTeller

+0

@StoryTeller 나는 '+ 4'(즉, 패딩에 대해 '+ 2')를 고려했다. –

+1

그래, 그게 문제 야. 패딩은 묶여 있지 않습니다. 지정한 금액을 초과 할 가능성은 없지만 실제로는 제한되지 않습니다. – StoryTeller

답변

2

보장되지 않습니다. 이것은 오늘날 많은 아키텍쳐에서 작동 할 것이지만, 8 바이트의 int (8 바이트 경계에 정렬 됨)이있는 시스템에서는 이것이 작동하지 않을 것입니다. 그렇지만 int에 덜 엄격한 정렬을 적용하려고하기 때문에 컴파일러 진단을 받아야합니다. [dcl.align]을 참조하십시오.

+0

"8 바이트 int arch"에서 작동하지 않는 이유에 대해 자세히 설명해 주시겠습니까? –

+0

@BiagioFesta'int'가 8 바이트 정렬이면,'Foo' 내의'i'의 오프셋은 8이 될 것이고, sizeof (Foo)는 16이 될 것입니다. – 1201ProgramAlarm

+0

맞습니다! 그래서'alignof (int) + sizeof (int) == sizeof (Foo)'가 정확할까요? (참고 :'int'에 대한'alignas (4)'가 제거되었습니다.) –