gpt4 book ai didi

c++ - 我可以在不破坏代码的情况下删除此警告吗?

转载 作者:行者123 更新时间:2023-11-28 07:00:23 25 4
gpt4 key购买 nike

    unsigned char data[] =
{
0, 0, 0, 0, 0,
0, 0, 0, 0, 0
};

*((int*) &data[1]) = 0x00256;

这会发出警告(见下文)我可以在不破坏代码的情况下删除它吗? by broke,也就是说,如果我转换为 unsigned char*,我实际上会复制比我正在寻找的更少的字节(不是所有 32 位整数),对吗?

warning: cast from 'unsigned char *' to 'int *' increases required alignment from 1 to 4 [-Wcast-align]

最佳答案

这里发生了一些事情。

1。指针复制。

如果 p 是 *int 类型,则 *p = 将复制 sizeof(int) (4) 个字节。同样,*char 类型的指针将复制 1 个字节。您使用的文字是 0x00000256 的缩写形式,这 4 个字节将被复制到从 &data[1] 开始的内存位置。

2。字节顺序

几乎可以肯定,此操作将分配以下内容(这与您的预期相反吗?):因为现在使用的几乎所有内容都是 little endian .

 data[1] = 0x56
data[2] = 0x2
data[3] = 0x0
data[4] = 0x0

3。对齐方式

考虑以下 C++ 程序(用于 alignof 运算符)

#include <iostream>

using namespace std;

int main(int argc,char *argv[])
{
char a[4];
int b[1];

cout << "char alignment = " << alignof(char) << endl;
cout << "int alignment = " << alignof(int) << endl;
cout << "a alignment = " << alignof(a) << endl;
cout << "b alignment = " << alignof(b) << endl;
}

产生

char alignment = 1
int alignment = 4
a alignment = 1
b alignment = 4

来自 C++ 规范(第 3.11 节)

Object types have alignment requirements (3.9.1, 3.9.2) which place restrictions on the addresses at which an object of that type may be allocated. An alignment is an implementation-defined integer value representing the number of bytes between successive addresses at which a given object can be allocated.

这意味着访问/存储类型受制于它的对齐方式,由实现来决定在违反此规则时会发生什么。

对于现代 Intel 硬件,请参阅 here , here , 和 here ,您的操作可能会奏效。但是访问未对齐的数据并不能保证在 Intel 上是原子的并且不鼓励这样做。但是,在其他 (Sparc) 硬件上,当您尝试存储该值时,您很可能会遇到异常(总线错误)并且程序会崩溃。

关于c++ - 我可以在不破坏代码的情况下删除此警告吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22586752/

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