gpt4 book ai didi

c - 在C中是否可以控制函数参数的对齐方式?

转载 作者:行者123 更新时间:2023-12-02 02:13:50 26 4
gpt4 key购买 nike

在 C 中,使用 MSVC 和/或 GCC,是否可以控制函数参数的对齐?

例如

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,这是不可能的,但需要确认/拒绝。

最佳答案

当 my_function_call 被调用时,它被传递给测试的副本。它本身没有通过测试,所以测试的对齐是无关紧要的。 alignment 属性是测试对象的属性,而不是它的值。

参数以平台指定的方式传递。通常,小参数在寄存器中传递。在大多数机器上,寄存器是不属于内存的特殊硬件,因此它们没有地址,因此没有对齐。

如果参数很大,平台规范可能会指定它在内存中传递。然后调用函数的工作是将 test 的副本放入内存并将其地址传递给被调用函数,然后被调用函数使用该地址检索副本。编译器可能会对临时副本的对齐产生一些影响,但我不知道有任何编译器会这样做。

如果出于某种原因,你希望被调用函数传递一个对齐的地址,那么,不是传递测试的值,而是传递它的地址或副本的地址(也作为对齐属性)。此外,如果您要传递一个对齐的地址并希望被调用的函数知道它是对齐的,则将函数的参数声明为指向具有对齐属性的类型的指针。 (这样做的语法取决于编译器,因为它不是标准 C 的一部分。我怀疑这样做的一种方法是使用 typedef 定义一个类型,并在 typedef 中包含对齐属性,然后声明函数参数成为指向该类型的指针。)

如果没有充分的理由,您不应该担心对象的对齐。

关于c - 在C中是否可以控制函数参数的对齐方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11490921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com