我使用内在函数,所以我需要使用内存对齐。 由于这个原因,我总是编码:
float* data = (float*) _mm_malloc(sizeof(float)*3, 64);
但在某些情况下,我有混合内容的数组。所以有些部分是对齐的,有些则没有。
我尝试使用简单的测试data%64 == 0
,但编译器抛出error: expression must have integral type
。指针不支持操作模数。
是否可以实现这样的功能:
// prototype
int testAlignment(void *pointer, int alignment);
float* data = (float*) _mm_malloc(sizeof(float)*3, 64);
testAlignment(data, 64); // true
testAlignment(data + 1, 64); // false
答案 0 :(得分:3)
%
运算符需要整数操作数。那么如何将指针转换为整数?
任何指针类型都可以转换为整数类型。 ...,结果是实现定义的。如果结果无法以整数类型表示,则行为未定义。 C11§6.3.2.35
考虑下面的情况,将float *
转换为unsigned
可能会有效,但它会冒未定义行为(UB)的风险。
float* data = foo();
if ((unsigned)data % 64 == 0) puts("aligned 64");
我们可以做得更好吗?
指向
void
的指针可以转换为指向任何对象类型的指针。 §6.3.2.31以下类型指定无符号整数类型,其属性是指向
void
的任何有效指针都可以转换为此类型...uintptr_t
... 这些类型是可选的§7.20.1.41
是的,通过转换为void*
然后转换为uintptr_t
,代码可以避免使用UB @coderredoc。仍然uintptr_t
是可选类型。然而,自C99以来,它很少见。
#include <stdint.h>
if ((uintptr_t)(void*)data % 64 == 0) puts("aligned 64");
答案 1 :(得分:-2)
没有为指针定义提醒操作,但可以将指针强制转换为整数。
.takeUntil(this.destroy$)
会做到这一点。