我读过aliged_alloc的人,我应该像这样使用它:
void* aligned_alloc( std::size_t alignment, std::size_t size );它返回我想要与alloc和alignment一起使用size的指针。
在我的代码中,我尝试使用它:
int *a = aligned_alloc(1024, 10*sizeof(a));并使用
std::cout << alignof(a) << std::endl;它给了我8,但我希望结果是1024,因为我的对齐度是1024。
我还不明白什么?
发布于 2019-06-13 13:16:50
a的对齐不是a所指的内存对齐。alignof(a)给出的值8是该类型所需的对齐,而不是a值的最大对齐。
当您执行alignof(a)时,它等同于执行alignof(int *),它要求编译器/机器上的对齐度为8。
发布于 2019-06-13 13:19:08
_Alignof运算符(这是alignof宏扩展到的内容)计算为给定操作数的类型的对齐要求,而不是它所指向的(如果是指针)。
它是在编译时计算的,所以如果操作数是一个指针,它就无法知道它指向什么,如果有什么指示。
C标准第6.5.3.4p3节规定:
_Alignof操作符产生其操作数类型的对齐要求。不计算操作数,结果是整数常量。当应用于数组类型时,结果是元素类型的对齐要求。
C++标准第8.3.6节规定:
1
alignof表达式产生其操作数类型的对齐要求。操作数应该是一个类型id,表示一个完整的对象类型,或者一个数组,或者是对其中一个类型的引用。 2结果为std::size_t型积分常数。 3当alignof应用于引用类型时,结果是引用类型的对齐。当对数组类型应用对齐时,结果是元素类型的对齐。
发布于 2019-06-13 13:28:12
alignof是一个静态运算符。它将为您提供对象类型的原生对齐。alignof(a)将是int*指针的本机对齐,而alignof(*a)将是int的本机对齐。
aligned_alloc不是编译时函数.它在运行时分配内存,该内存的对齐将是对指针存储的地址中的尾随零计数的2(使用gcc/clang提供的__builtin_ctz*内置程序最容易、最有效地计数)。
小片段
#include <stdlib.h>
#include <stdio.h>
#include <stdalign.h>
int main()
{
int *a = (int*)aligned_alloc(1023,1);
printf("%zu %zu\n", alignof(a), alignof(*a));
printf("ctz=%u\n",__builtin_ctzll((unsigned long long)a));
printf("%llu\n",1ull<<__builtin_ctzll((unsigned long long)a));
}在http://coliru.stacked-crooked.com/a/51606a7d251103a9上运行通常会返回与2^12或2^13对齐的指针--这是可以的,因为这种过度对齐的指针也肯定对2^10 (==1024)。
示例输出:
8 4
ctz=12
4096https://stackoverflow.com/questions/56581331
复制相似问题