是否可以手动检查c中的内存对齐?

时间:2018-02-25 18:21:23

标签: c memory-management allocation

我使用内在函数,所以我需要使用内存对齐。 由于这个原因,我总是编码:

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

2 个答案:

答案 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$)

会做到这一点。