给定的C代码
#include <stdio.h>
int x = 14;
size_t check()
{
struct x {};
return sizeof(x); // which x
}
int main()
{
printf("%zu",check());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的32位实现上给出4作为C的输出,而在C++中给出代码
#include <iostream>
int x = 14;
size_t check()
{
struct x {};
return sizeof(x); // which x
}
int main()
{
std::cout<< check();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出1.为何如此差异?
我知道为什么GCC默认不重新排序结构的成员,但我很少编写依赖于结构顺序的代码,所以有什么方法可以标记我的结构自动重新排序?
我有一个包含这样的声明的结构:
void (*functions[256])(void) //Array of 256 functions without arguments and return value
Run Code Online (Sandbox Code Playgroud)
在另一个函数我想定义它,但有256个函数!我可以这样做:
struct.functions[0] = function0;
struct.functions[1] = function1;
struct.functions[2] = function2;
Run Code Online (Sandbox Code Playgroud)
等等,但这太累了,我的问题是有办法做这样的事吗?
struct.functions = { function0, function1, function2, function3, ..., };
Run Code Online (Sandbox Code Playgroud)
编辑:Chris Lutz所说的修正了语法错误.
任务是通过I2C将数据从Arduino发送到STM32.
所以我使用C++在Arduino中定义了Struct和Enums:
enum PhaseCommands {
PHASE_COMMAND_TIMESYNC = 0x01,
PHASE_COMMAND_SETPOWER = 0x02,
PHASE_COMMAND_CALIBRATE = 0x03
};
enum PhaseTargets {
PHASE_CONTROLLER = 0x01,
// RESERVED = 0x02,
PHASE_LOAD1 = 0x03,
PHASE_LOAD2 = 0x04
};
struct saatProtoExec {
PhaseTargets target;
PhaseCommands commandName;
uint32_t commandBody;
} phaseCommand;
uint8_t phaseCommandBufferSize = sizeof(phaseCommand);
phaseCommand.target = PHASE_LOAD1;
phaseCommand.commandName = PHASE_COMMAND_SETPOWER;
phaseCommand.commandBody = (uint32_t)50;
Run Code Online (Sandbox Code Playgroud)
另一方面,我使用C得到了相同的定义:
typedef enum {
COMMAND_TIMESYNC = 0x01,
COMMAND_SETPOWER = 0x02,
COMMAND_CALIBRATE = 0x03
} MasterCommands;
typedef enum {
CONTROLLER = 0x01,
// RESERVED = …Run Code Online (Sandbox Code Playgroud) (sizeof)char总是在32位GCC编译器中返回1.
但由于32位编译器的基本块大小为4,当基本大小为4字节时,char如何占用单个字节?
考虑以下因素:
struct st
{
int a;
char c;
};
Run Code Online (Sandbox Code Playgroud)
sizeof(st)返回为8,默认块大小为4字节(因为分配了2个块)
我永远无法理解为什么sizeof(char)在分配大小为4的块时返回为1.
有人可以解释一下吗???
我会非常感谢任何回复解释它!
编辑:'bits'的拼写错误已更改为'bytes'.我对第一次编辑的人抱歉.我回滚了编辑,因为我没有注意到你做的改变.感谢所有那些指出必须改变的人,尤其是@Mike Burton,因为他们对这个问题进行了抨击,并且@jalf似乎对我对概念的理解得出了结论!
今天,我惊讶地发现了这一点
当sizeof运算符应用于类,结构或联合类型时,结果是该类型的对象中的字节数,以及为在单词边界上对齐成员而添加的任何填充.结果不一定与通过添加各个成员的存储要求而计算的大小相对应.
我不知道它,我很确定这个东西打破了我的一些旧代码:读取二进制文件,我曾经有这样的结构:
struct Header
{
union {
char identc[4];
uint32 ident;
};
uint16 version;
};
Run Code Online (Sandbox Code Playgroud)
并fread通过sizeof以下方式直接读取这6个字节:
fread( &header, sizeof(header), 1, f );
Run Code Online (Sandbox Code Playgroud)
但现在sizeof(header)回来了8!
是否有可能sizeof(header)返回旧的GCC版本6,或者我的想法完全消失了?
无论如何是否有任何其他运算符(或预处理器指令或其他)让编译器知道结构有多大 - 不包括填充?
否则,从一个不需要编写太多代码的文件中读取原始数据结构的干净方法是什么?
编辑:我知道这不是读取/写入二进制数据的正确方法:根据机器的字节顺序和内容,我会得到不同的结果.无论如何,这种方法是最快的方法,我是juist试图读取一些二进制数据以快速获取其内容,而不是编写一个我将在未来使用或发布的好应用程序.
我正在使用Code :: Blocks IDE和GNU GCC编译器.
struct test
{
char a;
char e;
char f;
char b;
char d;
};
Run Code Online (Sandbox Code Playgroud)
sizeof(test)回报5.
我读到了这个答案: 为什么结构的sizeof不等于每个成员的sizeof之和?
为什么最后没有填充char,所以sizeof(test)返回6或8?一旦我添加short等等int,我可以提出更多问题.但我认为这个问题现在很好.填充不会使处理器更容易使用结构吗?
我有一个C++程序将TCP标头表示为结构:
#include "stdafx.h"
/* TCP HEADER
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | …Run Code Online (Sandbox Code Playgroud) 这是一个简单的问题.代码优先.
struct A {
int x;
};
struct B {
bool y;
};
struct C {
int x;
bool y;
};
Run Code Online (Sandbox Code Playgroud)
在主要功能中,我打电话
cout << " bool : " << sizeof(bool) <<
"\n int : " << sizeof(int) <<
"\n class A : " << sizeof(A) <<
"\n class B : " << sizeof(B) <<
"\n class C : " << sizeof(C) << "\n";
Run Code Online (Sandbox Code Playgroud)
结果是
bool : 1
int : 4
class A : 4
class B : 1
class C …Run Code Online (Sandbox Code Playgroud) struct A -->8 bytes
{
char c;
char d;
//2 padding here
int i;
};
struct B -->12 bytes
{
char c;
//3 padding here
int i;
char d;
//3 padding here
};
Run Code Online (Sandbox Code Playgroud)
现在,我不明白以下示例:
typedef struct { -->**shouldn't it be 12 bytes**
int a;
char *str;
} TestS;
TestS s;
int main(int argc, char *argv[]) {
printf("An int is %lu bytes\n", sizeof( int )); -->4
printf("A Char * is %lu bytes\n", sizeof( char …Run Code Online (Sandbox Code Playgroud)