gpt4 book ai didi

指示内存对齐要求的编译器常量

转载 作者:太空狗 更新时间:2023-10-29 15:09:15 24 4
gpt4 key购买 nike

一些 CPU 架构(x86 除外)非常不喜欢在未对齐的地址读取和写入多字节数字,以至于它们在检测到这种情况时引发 SIGBUS 异常,并迫使程序员按字节顺序手动执行所有操作。虽然对于需要这样做的平台可能无能为力,但在允许未对齐访问的平台(例如 x86)上检查对齐并执行字节操作是愚蠢的。问题是:C/C++ 编译器是否定义了一个指示对齐要求的常量

目前,我正在使用这个:

#if defined(_M_IX86) | defined(__i386) | defined(__i386__) | defined(i386) | defined(_X86_)
// Unaligned access is allowed.
#elif defined(_M_X64) | defined(__x86_64__) | defined(__x86_64) | defined(__amd64) | defined(__amd64__) | defined(_M_AMD64)
// Unaligned access is allowed.
#else
#define ALIGNED_ACCESS_ONLY
#endif

但它看起来太“自制”了:它没有说明当前硬件平台的实际属性,只是描述了我自己对 x86-32 和 x86-64 以及这些平台最流行的常量名称的考虑。

最佳答案

我不会从技术上回答您提出的问题,但我会提出一个解决方法,以防您的问题的答案是否定的。

如果您的代码是在配置脚本的帮助下编译的,您可以测试是否需要对齐访问。 GNU autoconf 具有执行此操作的功能:

http://www.gnu.org/software/autoconf-archive/ax_check_aligned_access_required.html

基本上它会编译以下小程序,运行它并查看结果:

#include <stdio.h>
#include <stdlib.h>

int main()
{
char* string = malloc(40);
int i;
for (i=0; i < 40; i++)
{
string[[i]] = i;
}

{
void* s = string;
int* p = s+1;
int* q = s+2;

if (*p == *q) { return 1; }
}
return 0;
}

关于指示内存对齐要求的编译器常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28459976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com