gpt4 book ai didi

c++ - 使用 bool 导出压缩结构

转载 作者:太空宇宙 更新时间:2023-11-04 08:41:22 26 4
gpt4 key购买 nike

导出包含 bool 值的打包结构的最佳做法是什么?

我问这个是因为我正在尝试找到最好的方法来做到这一点。目前我做的:

#ifndef __cplusplus
#if __STDC_VERSION__ >= 199901L
#include <stdbool.h> //size is 1.
#else
typedef enum {false, true} bool; //sizeof(int)
#endif
#endif

现在在上面, bool 值的大小可以是 1 或 sizeof(int)..

所以在这样的结构中:

#pragma pack(push, 1)
typedef struct
{
long unsigned int sock;
const char* address;
bool connected;
bool blockmode;
} Sock;
#pragma pack(pop)

与 C99 和 C++ 相比,如果使用 C,则对齐方式不同。如果我将其导出为整数,则 bool 值大小为 1 的语言会出现对齐问题,需要填充结构。

我想知道在 C99 之前的情况下是否最好将 bool 定义为 char,但感觉不对。

有什么更好的主意吗?

最佳答案

这取决于您要寻找什么:保留空间但运行一些额外的指令,或者浪费几个字节但运行速度更快。

如果您希望速度更快,但可以“浪费”几个字节的空间(即每个 bool 标志的单个值,请参阅 sizeof bool 讨论),则您当前的方法更胜一筹。这是因为它可以直接加载和比较 bool 值,而不必将它们从打包字段中屏蔽掉(见下文)。

如果您想节省空间,那么您应该查看 C bitfields :

struct Sock {
...
int connected:1; // For 2 flags, you could also use char here.
int blockmode:1;
}

或者滚动你自己的“标志”并设置整数值的位:

#define SOCKFLAGS_NONE      0
#define SOCKFLAGS_CONNECTED (1<<0)
#define SOCKFLAGS_BLOCKMODE (1<<1)

struct Sock {
...
int flags; // For 2 flags, you could also use char here.
}

这两个示例都或多或少地导致了相同的代码,这些代码屏蔽位并四处移动值(额外的指令),但比简单的 bool 值更密集。

关于c++ - 使用 bool 导出压缩结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23401968/

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