【发布时间】:2023-05-11 16:15:02
【问题描述】:
我需要对 C 中的两个指针(地址,而不是它们指向的内容)进行超高性能交换。我知道地址是对齐的(16 的倍数)并且是连续的,并且我已经检查过这在每次执行中是否保留。代码如下:
Nodo a __attribute__((aligned(8))), b __attribute__((aligned(4)));
Nodo *nodo_superior __attribute__((aligned(4)));
nodo_superior = &a;
Nodo * nodo_actual __attribute__((aligned(4)));
nodo_actual=&b;
printf("%ld %ld\n", nodo_superior, nodo_actual);
控制台上的结果是这样的(请注意,第一个地址应该“过度”对齐,以便下一个方法起作用):
140594404335200 140594404335216
现在要交换地址,我想更改每个指针的第 5 位:
nodo_superior ^= 16;
nodo_actual ^= 16;
但是,不幸的是,C 编译器不允许这样做,因为整数不能与指针值混合:这是错误,而不是警告。如果我尝试将指针包含在这样的联合中:
union {
Nodo * nodo_actual;
int local_int;
} na;
有这样的想法:
na.local_int ^= 16;
然后性能会降低,因为(我想)如果 nodo_actual 在联合中,编译器就无法对它应用/推断优化。 有什么想法可以强制编译器按照我的意愿行事吗?当然,我可以更改生成的汇编程序,但我认为这不是一个好的选择,
【问题讨论】:
-
不要假设指针和 int 大小相同...*.com/questions/4574745/…