为什么sizeof();这个结构有16个字节?我正在用g ++编译.
struct bitmapfileheader {
unsigned short bfType;
unsigned int bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned int bfOffBits;
};
Run Code Online (Sandbox Code Playgroud) 我想之前必须提出类似(重复)的问题.但是我找不到它们.基本上我不知道要搜索什么.所以在这里问一下.
为什么struct的大小不等于其各个成员类型的大小总和?我正在使用visual C++编译器.
例如,假设32位机器.{=> sizeof(int)== 4; sizeof(char)== 1; sizeof(短)== 2; }
struct {
int k;
char c;
} s;
Run Code Online (Sandbox Code Playgroud)
预期的大小是4 + 1 = 5; 但sizeof(s)给出8.这里char占用4个字节而不是1.我不知道确切原因,但我的猜测是编译器这样做是为了提高效率.
struct{
long long k;
int i;
} s;
Run Code Online (Sandbox Code Playgroud)
预期大小为4 + 4 = 8(在32位机器上)和8 + 4 = 12(在64位机器上).但奇怪的是sizeof(s)给出16.这里int和long long每个占用8个字节.
#include <stdio.h>
int main(){
struct word1{
char a;
int b;
char c;
};
struct word2{
char a;
char b;
int c;
};
printf("%d\t%d\n", sizeof(int), sizeof(char)); //Output : 4 1
printf("%d\t%d\n", sizeof(struct word1), sizeof(struct word2)); //Output: 12 8
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代码可在IDEONE获得.
为什么struct 1(word1)的大小大于struct 2(word2)的大小?
这是编译器问题吗?
给出示例类
class test
{
public:
test();
~test();
void someMethod();
void someOtherMethod();
private:
int var;
};
Run Code Online (Sandbox Code Playgroud)
是sizeof(test) == sizeof(int),或者我们不能做出这样的假设?它依赖于平台/编译器吗?
编辑:
对此的动机是通过流读/写类.类确实包含一个整数,有一些方便的访问方法 - 整数的最高位字节保留用于标志,3个低位字节表示整数24位数.鉴于此,想法是编写这样的类变量的数组,并在需要时将它们读作plain int.引用可能答案的问题没有解决这个问题 - 更多的是关于使用多个元素的填充.
我试图测量结构及其字段(Playground)的大小:
use std::mem;
struct MyStruct {
foo: u8,
bar: char,
}
println!("MyStruct: {}", mem::size_of::<MyStruct>());
let obj = MyStruct { foo: 0, bar: '0' };
println!("obj: {}", mem::size_of_val(&obj));
println!("obj.foo: {}", mem::size_of_val(&obj.foo));
println!("obj.bar: {}", mem::size_of_val(&obj.bar));
Run Code Online (Sandbox Code Playgroud)
该程序打印:
MyStruct: 8
obj: 8
obj.foo: 1
obj.bar: 4
Run Code Online (Sandbox Code Playgroud)
因此结构的大小大于其字段大小的总和(这将是5).这是为什么?
我有一个结构用于构建控制板的消息我需要保持C167 16位Keil编译器和32位Tricore gcc编译器之间的软件兼容性.
typedef struct
{
unsigned char new_weld_status[2];
UINT32 new_weld_count;
UINT16 new_weld_fail_count;
} NEW_PULSE_DATA;
Run Code Online (Sandbox Code Playgroud)
该数组new_weld_status[2]在16位编译器上占用2个字节,在32位编译器上占用4个字节.我正在考虑new_weld_status[2]用gcc编译时替换所有的联合.但是有一个我可以用于gcc的开关,使chars适合/对齐2个字节?
谢谢
在下面的代码中,我定义了一个9 字节的结构头,它与 16 字节的大小对齐。然后我从堆中动态分配 9 个字节并将其分配给标头指针。
struct header
{
uint8_t chunk_id;
long int format;
};
int main()
{
std::cout << "sizeof(header) " << sizeof(header) << '\n';
auto head = (header*)malloc(9);
head->chunk_id =3;
head->format=5;
std::cout << (int)head->chunk_id << " " << head->format << '\n' << sizeof(*head);
free(head);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
sizeof(header) 16
3 5
16
Run Code Online (Sandbox Code Playgroud)
事实证明,sizeof仍然通知这个对象是 16 个字节(尽管它是 9 个)。我想它只是看结构的定义。但是,当sizeof的大小与实际对象大小不匹配时,一切如何工作(包括运算符“->”)?
这是结构.
//Structure pour communiquer les paramètres de traitement à travers le MMF
struct params_traitement_mmf
{
int brilliance;
double contraste;
char convolution[9];
};
Run Code Online (Sandbox Code Playgroud)
这是我显示此结构大小的代码:
char valeur[10];
sprintf(valeur, "%d", sizeof(params_traitement_mmf));
MessageBoxA(NULL, valeur, "rien", MB_OK);
Run Code Online (Sandbox Code Playgroud)
MessageBox显示32.谢谢!
我想自己实现二进制序列化,而不使用Boost或任何其他第三方库.
在C++中,实现它的最简单方法是使用ofstream然后通过网络发送二进制文件.但是有没有其他流类可以用作临时缓冲区以避免将文件写入磁盘?
另外,我怎样才能在纯C中实现这一目标?
我随机创建了一个Struct,它的大小让我感到惊讶,因为结果不等于我的计算结果:
int main( int argc, char ** argv ) {
struct S
{
int i;
int b;
int c;
long int e;
};
cout << sizeof (struct S) << endl; //sizeof is still an operator
return 0;
}
Run Code Online (Sandbox Code Playgroud)
通常,3*int + 1*long int = 3*4 + 8 = 20.
但结果是24.
这4个字节来自哪里?