首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Aligned_alloc行为

Aligned_alloc行为
EN

Stack Overflow用户
提问于 2019-06-13 13:13:09
回答 3查看 283关注 0票数 3

我读过aliged_alloc的人,我应该像这样使用它:

代码语言:javascript
复制
void* aligned_alloc( std::size_t alignment, std::size_t size );

它返回我想要与allocalignment一起使用size的指针。

在我的代码中,我尝试使用它:

代码语言:javascript
复制
int *a = aligned_alloc(1024, 10*sizeof(a));

并使用

代码语言:javascript
复制
std::cout << alignof(a) << std::endl;

它给了我8,但我希望结果是1024,因为我的对齐度是1024。

我还不明白什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-13 13:16:50

a的对齐不是a所指的内存对齐。alignof(a)给出的值8是该类型所需的对齐,而不是a值的最大对齐。

当您执行alignof(a)时,它等同于执行alignof(int *),它要求编译器/机器上的对齐度为8。

票数 5
EN

Stack Overflow用户

发布于 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应用于引用类型时,结果是引用类型的对齐。当对数组类型应用对齐时,结果是元素类型的对齐。

票数 3
EN

Stack Overflow用户

发布于 2019-06-13 13:28:12

alignof是一个静态运算符。它将为您提供对象类型的原生对齐。alignof(a)将是int*指针的本机对齐,而alignof(*a)将是int的本机对齐。

aligned_alloc不是编译时函数.它在运行时分配内存,该内存的对齐将是对指针存储的地址中的尾随零计数的2(使用gcc/clang提供的__builtin_ctz*内置程序最容易、最有效地计数)。

小片段

代码语言:javascript
复制
#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)。

示例输出:

代码语言:javascript
复制
8 4
ctz=12
4096
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56581331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档