首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数组的起始地址对齐为32位的倍数?

数组的起始地址对齐为32位的倍数?
EN

Stack Overflow用户
提问于 2017-07-18 15:03:17
回答 2查看 1.8K关注 0票数 0

我有一个数组类型的char,它是全局的。我想要开始地址与32位对齐。当我检查地图文件中的虚拟地址时,它是xxxxxx56H。如何将起始地址对齐为32位的倍数。我需要通用解决方案,而不是编译器依赖的解决方案。我试过了

代码语言:javascript
运行
复制
#pragma pack(32)
char array[223];
#pragma pack

但不起作用。

为了和32位对齐,最后两位地址应该是0。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-18 15:18:07

包装是完全不相关的东西。若要对齐静态变量或结构成员(相对于结构启动),请使用标准 specifier

如果您需要平台上的最大对齐(即适合于任何类型的对齐),请使用max_align_t,对于特定的字节对齐,只需将对齐指定为常量表达式:

代码语言:javascript
运行
复制
_Alignas(32 / CHAR_BIT) char a[10];

(如果除法有余数,就会产生问题;您指的是32 还是32 字节?标准不保证一个字节有8位。)

如果打算将数组强制转换为任何其他类型,则仍然通过违反有效类型(也称为严格混叠)规则来调用未定义的行为。对数组使用正确的类型,并使用更大的类型对齐或任意类型,例如使用条件运算符:

代码语言:javascript
运行
复制
Alignas(_Alignof(int) > 8 ? _Alignof(int) : 8) int a[10];
票数 3
EN

Stack Overflow用户

发布于 2017-07-18 16:29:23

定义在32位边界上对齐的char数组的一种可移植方式是:

代码语言:javascript
运行
复制
union {
    char array[223];
    unsigned long ul;
} u;

u将在32位边界上对齐,如果unsigned long类型需要,则可能会有2的更大功率,这在您的系统中是非常可能的。该数组以u.array的形式访问。没有语用,没有C11特定的语法,没有编译器特定的扩展。

如果uint32_t类型可用,您可以使用它来代替unsigned long

这个解决方案实际上并不是可移植的,但是对于那些不支持_Alignas说明符的过时编译器来说,这是一个很好的解决方案。您的编译器似乎与当前(或以前的)C标准不同步。

唯一正确的解决方案是使用_Alignas说明符。如果您给出了更多的上下文,例如您使用的是什么系统和编译器,以及为什么需要32位对齐,那么可以为您的问题找到更好的解决方案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45170533

复制
相关文章

相似问题

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