gpt4 book ai didi

旧 "struct hack"(?) 的符合变体

转载 作者:太空狗 更新时间:2023-10-29 16:39:01 26 4
gpt4 key购买 nike

我相信我已经找到了一种方法来实现类似可移植 C89 中众所周知的“struct hack”的方法。我很好奇这是否真的严格符合 C89。

主要思想是:我分配足够大的内存来容纳初始结构和数组元素。确切的大小是 (K + N) * sizeof(array_base_type),其中选择 K 以便 K * sizeof(array_base_type) >= sizeof(the_struct) N 是数组元素的数量。

首先,我取消引用 malloc() 返回的指针以存储 the_struct,然后我使用指针算法获得指向结构后面数组开头的指针.

一行代码胜过一千字,所以这里是一个最小的实现:

typedef struct Header {
size_t length;
/* other members follow */
} Header;

typedef struct Value {
int type;
union {
int intval;
double fltval;
} v;
} Value;

/* round up to nearest multiple of sizeof(Value) so that a Header struct fits in */
size_t n_hdr = (sizeof(Header) + sizeof(Value) - 1) / sizeof(Value);

size_t n_arr = 42; /* arbitrary array size here */
void *frame = malloc((n_hdr + n_arr) * sizeof(Value));

if (!frame)
return NULL;

Header *hdr = frame;
Value *stack_bottom = (Value *)frame + n_hdr;

我主要担心的是最后两个赋值(使用 frame 作为指向 Header 的指针和指向 Value 的指针)可能会违反严格的别名规则。但是,我没有将 hdr 取消引用为指向 Value 的指针 - 它只是在 frame 上执行的指针运算,以便访问值数组的第一个元素,所以我没有使用不同类型的指针有效地访问相同对象。

那么,这种方法是否比经典的 struct hack(已被官方认为是 UB)更好,或者它也是 UB?

最佳答案

“显而易见的”(好吧......不是很明显,但它是 想到的 :-) )导致它中断的方法是使用一个向量化编译器,它以某种方式决定可以将 64 个 Header 从来自 malloc 的 hdr 的 42 舍入到 64+ 区域加载到 vector 寄存器中 总是分配足够的空间来进行矢量化。将 vector 寄存器存储回内存可能会覆盖其中一个 Value

我认为这个矢量化编译器可以指向标准(好吧,如果编译器有手指......)并声明符合性。

不过,在实践中,我希望这段代码能够正常工作。如果您遇到矢量化编译器,请添加更多空间(使用可以插入最小值的机器相关宏进行四舍五入)并继续。 :-)

关于旧 "struct hack"(?) 的符合变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18310789/

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