2013-03-16 1 views
3

다음 로컬 변수 (스택에 저장 됨)가 있습니다.스택 변수를 16byte 경계에 정렬하는 방법

struct test1 { 
    int a; 
    int b; 
    char c; 
}; 

어떻게 스택에 16byte 경계 정수 a의 시작 주소를 정렬합니까?

이 C 코드를 사용자 지정 MIPS ISA 프로세서에서 실행하고 있습니다.

+0

참조 http://stackoverflow.com/questions/841433/gcc-attribute-alignedx-explanation –

답변

2

다음은 데이터를 정렬하는 비표준 방식입니다. MIPS ISA C 컴파일러에

struct test1 *pdata; 

// here we assume data on stack is word aligned 
pdata = alloca(sizeof(*pdata) + 14); 
if (pdata & 0xF) 
{ 
    pdata = (unsigned char*)pdata + 16 - (pdata & 0xF); 
} 
+0

은 alloca (sizeof (* pdata) + 15) 여야합니다. 아니? –

1

AFAIK는 구조 (32 비트 인) 바로 int를 추가,이 경우의 단어 경계에 정렬을 강제한다. 그래서 :

struct test1 { 
    int a;  // 4 bytes 
    int b;  // 4 bytes 
    int foralign;// 4 bytes for 16 byte alignment 
    char c;  // 1 byte but will be aligned 4 bytes 

}; 
+0

Tecnhincally 그것은 단지 크기가 커지지 만 16 바이트 정렬되지는 않습니다. –

+0

@Valeri 컴파일러 단어 정렬이 켜지면 16 바이트로 증가합니다 ... 예. 내가 잘못하면 내 대답을 지울 것입니다. 나는 너무 불필요한 답변 더미를 좋아하지 않는다. ... 미리 감사드립니다. – Ihsan

1

은 불행하게도 그런 식으로 정렬 된 객체를 얻기 위해 더 표준 방법이 없다. 거의 항상 GCC에 __attribute__과 같은 컴파일러 관련 트릭이 있지만 컴파일러의 설명서를 확인해야합니다.

해당 정렬에는을 사용하십시오. 따라서 표준 방법이 없기 때문에 이미 확장 기능에 의존하고 있으므로 더 이상의 실제적인 위험은 없습니다.

대용량의 원소 객체를 포함하고있는 유니온은 종종 트릭을하지만, MIPS CPU의 가장 큰 C 원소는 long longdouble이며 단지 8 바이트라고 생각합니다.

관련 문제