我可以在不中断代码的情况下删除此警告吗?
Can I remove this warning without break code?
unsigned char data[] =
{
0, 0, 0, 0, 0,
0, 0, 0, 0, 0
};
*((int*) &data[1]) = 0x00256;
this给出警告(见下文)我可以在不破坏代码的情况下删除它吗?通过break,也就是说,如果我转换到unsigned char*
,我将复制比我正在寻找的更少的字节(不是所有32位整数),对吧?
警告:从'unsigned char *'转换为'int *'需要增加[-Wcast-align]
这里有几件事。
1。指针复制。
如果p是*int类型,那么*p =将复制sizeof(int)(4)个字节。同样,*char类型的指针将复制1个字节。您使用的字面值是0x00000256的缩写形式,这4个字节将被复制到从&data[1]开始的内存位置。
2。字节顺序
几乎可以肯定的是,这个操作将赋值如下(这是否与你期望的相反?):因为现在使用的几乎所有东西都是小端序的。
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节)
对象类型有对齐要求(3.9.1,3.9.2),这对该类型对象可以分配的地址进行了限制。对齐是一个实现定义的整数值,表示一个给定对象可以被分配的连续地址之间的字节数。
这意味着访问/存储类型取决于它的对齐,它是由实现来决定当它被违反时会发生什么。
对于现代英特尔硬件(参见这里,这里和这里),您的操作可能有效。但是访问不对齐的数据并不能保证在Intel上是原子的,因此不鼓励这样做。然而,在其他(Sparc)硬件上,当试图存储该值时,您很可能会遇到异常(总线错误),程序将崩溃。
相关文章:
- G++ 发出警告,要求删除一个代码的数组,但不删除另一个代码的数组
- 如何删除 vsCode 中的 C++ 11 扩展警告
- 删除显式默认函数声明时的警告
- 如何将项目属性设置为删除警告MSB8004:中间目录不会以落后的斜线结束
- 使用代码调整删除"comparison is always false"警告
- 如何在保留弃用警告的同时删除类
- 警告C4150在尝试包装本机C 类时,指向不完整类型的指针删除
- 如何工作已弃用的警告以及如何在使用 JsonCpp 时删除它们?
- 警告-未引用的内联函数已被删除
- 是否有任何工具可以警告可能滥用删除或删除[]
- 警告从结构的 QList 中删除动态创建的结构
- GCC - 删除"is used uninitialized in this function"警告
- 警告:传递'g_timeout_add_seconds'删除的参数 2
- 如何删除关于负偏移的警告,这些警告在正确的流分支的情况下永远不会发生
- 删除C++模板类中的性能警告
- 从断言中删除未使用的值警告
- 将 GCC 中的"删除"警告变成错误
- 警告C4247和C4248是什么意思,为什么从Visual c++ 2005中删除
- 如何删除警告LNK4217和LNK4049
- 如何使用GMTIME和ASCTIME删除警告C4996