我们可以使用预处理器来知道是否unsigned long long定义了:
#include <limits.h>
#ifndef ULLONG_MAX
typedef unsigned long t_mask;
#else
typedef unsigned long long t_mask;
#endif
Run Code Online (Sandbox Code Playgroud)
但是如何知道如何__uint128_t定义?
我正在研究使用 ctypes 来使用 C 函数来操作必须在 16 字节边界上对齐的 SSE (__m128) 数据。
我找不到一种简单的方法来控制由 ctypes 分配的内存对齐,因此,现在,我让 ctypes 调用提供正确对齐内存缓冲区的 C 函数。
我使用这种方法的问题是我必须手动显式释放此内存以防止它被泄漏。
有没有办法控制 ctypes 分配的内存对齐?或者有没有办法注册一个清理函数来释放由 ctypes 调用的 C 函数分配的内存(除了标准的 python 运算符__ del __)?
最好的方法是什么?
我__int128用作struct的成员.它可以找到-O0(没有优化).
但是,如果启用了优化(-O1),则会因段故障而崩溃.
它在指令处崩溃movdqa,需要将var对齐16,而地址的分配malloc()仅由8对齐.
我尝试禁用SSE优化-mno-sse,但无法编译:
/usr/include/x86_64-linux-gnu/bits/stdlib-float.h:27:1: error: SSE register return with SSE disabled
Run Code Online (Sandbox Code Playgroud)
所以,我能做些什么,如果我想使用__int128和-O1两者兼而有之?
在此先感谢吴
顺便说一下,如果__int128仅在堆栈上使用(不在堆上),似乎没问题.
====编辑====
对不起,我没说实话.
其实我没用过malloc().我使用了一个内存池lib,它返回8对齐的地址.我说malloc()只是为了让事情变得简单.
经过测试,我已经知道它malloc()与16对齐.并且__int128成员也在结构中对齐16.
所以问题是我的内存池lib.
非常感谢.