gpt4 book ai didi

c - GCC - 如何重新对齐堆栈?

转载 作者:太空狗 更新时间:2023-10-29 17:08:32 25 4
gpt4 key购买 nike

我尝试构建一个使用 pthreads 和 __m128 SSE 类型的应用程序。根据 GCC 手册,默认堆栈对齐为 16 字节。为了使用__m128,要求是16字节对齐。

我的 objective-c PU 支持 SSE。我使用不支持运行时堆栈重新对齐的 GCC 编译器(例如 -mstackrealign)。我不能使用任何其他 GCC 编译器版本。

我的测试应用程序如下所示:

#include <xmmintrin.h>
#include <pthread.h>
void *f(void *x){
__m128 y;
...
}
int main(void){
pthread_t p;
pthread_create(&p, NULL, f, NULL);
}

应用程序产生异常并退出。经过简单调试(printf "%p", &y),发现变量y不是16字节对齐的。

我的问题是:如何在不使用任何 GCcflags和属性(它们没有帮助)的情况下正确地重新对齐堆栈(16 字节)?我应该在此线程函数 f() 中使用 GCC 内联汇编器吗?

最佳答案

在堆栈上分配一个比 sizeof(__m128) 大 15 个字节的数组,并使用该数组中第一个对齐的地址。如果您需要多个,请将它们分配到一个数组中,并留出一个 15 字节的对齐边距。

我不记得分配 unsigned char 数组是否能让您免受编译器严格的别名优化的影响,或者它是否只能以相反的方式工作。

#include <stdint.h>

void *f(void *x)
{
unsigned char y[sizeof(__m128)+15];
__m128 *py = (__m128*) (((uintptr_t)&y) + 15) & ~(uintptr_t)15);
...
}

关于c - GCC - 如何重新对齐堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2765294/

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