2012-07-15 2 views
3

C에서 MSVC 및/또는 GCC를 사용하면 함수 매개 변수의 정렬을 제어 할 수 있습니까?C에서 함수 매개 변수의 정렬을 제어 할 수 있습니까?

int main() 
{ 
    __declspec(align(64)) unsigned long long int 
    test = 5; 
    my_function_call(test); 
    return(EXIT_SUCCESS); 
} 

void my_function_call(unsigned long long int fc_test) 
{ 
    return; 
} 

달성하고자하는 것은 fc_test가 64 바이트 정렬이라는 것입니다.

AFAICT이 작업은 불가능하지만 확인/거부가 필요합니다.

+3

난 당신이 이전 질문에 관심이 생각하는 (!) : http://stackoverflow.com/questions/841433/gcc-attribute-alignedx-explanation – ziu

+0

네 감사합니다. 나는 게시하기 전에 검색했지만 그 기사는 나를 도망 갔다. –

답변

3

my_function_call이 호출되면 test 사본이 전달됩니다. 그것은 테스트 자체를 통과하지 않기 때문에 테스트의 정렬은 부적합합니다. 정렬 속성은 값이 아닌 테스트 객체의 속성입니다.

인수는 플랫폼 지정 방식으로 전달됩니다. 보통 작은 인수가 레지스터에 전달됩니다. 대부분의 시스템에서 레지스터는 메모리의 일부가 아닌 특수 하드웨어이므로 주소가 없으므로 정렬이되지 않습니다.

인수가 큰 경우 플랫폼 사양에서 인수가 메모리로 전달되도록 지정할 수 있습니다. 그런 다음 호출 함수의 역할은 테스트 복사본을 메모리에 저장하고 해당 주소를 호출 된 함수에 전달하고 호출 된 함수는 해당 주소를 사용하여 복사본을 검색하는 것입니다. 컴파일러가 임시 복사본의 정렬에 약간의 영향을 줄 수는 있지만 가능하지는 않습니다.

어떤 이유로 든 호출 된 함수가 정렬 된 주소로 전달되도록하려는 경우 test 값을 전달하는 대신 해당 주소 또는 사본 주소 (정렬 속성으로도 사용됨)를 전달하십시오. 또한 정렬 된 주소를 전달하고 호출 된 함수가 정렬 된 것을 알기를 원하면 함수의 매개 변수를 정렬 속성이있는 유형의 포인터로 선언하십시오. (이 작업을 수행하는 구문은 표준 C의 일부가 아니기 때문에 컴파일러에 따라 다릅니다. 그렇게하는 방법은 typedef를 사용하여 유형을 정의하고 typedef에 정렬 속성을 포함시킨 다음 함수 매개 변수를 선언하는 것입니다. 해당 유형에 대한 포인터가되어야합니다.)

정당한 이유없이 개체 정렬에 대해 자신을 염려하지 않아야합니다.

+0

GCC (최근 버전, 4.5+)는 함수 정의 스택에서의 위치와 관련하여 변수 정의 정렬 속성을 사용합니다! –

-1

x64에서 정렬은 16 바이트입니다.

ARM에서는 8 바이트로 정렬됩니다.

x86의 경우 정렬은 4 바이트입니다. 변수에 값에 의한 변수를 연속 double-word 비교 및 ​​스왑을 수행하는 함수에 전달하면 이 잘못 정렬되고 segfault가 될 수 있습니다. 변수의 주소를 전달하거나 로컬 변수를 정의하고 인수 복사본을 만들어야한다고 생각합니다.

MSVC로 제어 할 수 없습니다. GCC는 분명히 스택 변수 정의 정렬 예선에 명예를하지

관련 문제