c - C 中的 15 位结构

标签 c struct

我需要为一个项目创建一个内存结构,其中每个字包含 15 位。当我检查数组的大小时,我发现它的大小为 2000 字节,我认为这是因为编译器字节对齐。

有没有办法创建大小为 1875 字节的结构?

这是我使用的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#pragma pack(push,1)
struct myword
{
    unsigned int val : 15;
};
struct mymemmory{

    struct myword arr[1000];
};
#pragma pack(pop)


int main()
{
    int size = sizeof(struct mymemmory);
    printf("Size of arr: %d\n",size);
    return 0;
}

当我使用 #pragma pack(push,0) 时,我得到的大小是 4000 字节。

最佳答案

不,没有。如果您需要位级别的粒度,您必须自己实现它,制作一个 1875 字节的数组并手动计算索引和位掩码以提取所需的 15 位。如果您想保持理智,可以将此功能分解为访问器函数,理想情况下使用 C++ 或类似的东西,您可以在其中创建完全抽象工作的自定义类(如此简单的索引使用会完成所有“真实索引”和位移位/掩码在幕后工作;std::vector<bool> 已经为单个位做了类似的事情)。

当然,真正的理智是意识到对超过 125 个字节的数据进行狡辩是愚蠢的。在极少数情况下,为每个值(尤其是对于这么少的值)保存十六分之一是值得的,而我能想到的(实际上需要磁盘上的紧凑表示)仍然可以通过从光盘转换来更好地处理表示在读取时扩展为内存表示,并在写入时转换回,以避免在每次读/写时处理所有移位和屏蔽的麻烦和计算开销。

关于c - C 中的 15 位结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42301973/

相关文章:

c - MPI_Scatter 无法正常工作

c - fprintf 是否在幕后使用 malloc() ?

c - 套接字服务器程序中的运行时绑定(bind)错误

c - 如何将包含已分配内存的结构保存到文件?

在 C 中从 char * 转换为 char[31]

c - 这个函数被认为是可重入的吗?

java - 如何构造 JNI 调用以避免内存泄漏?

mongodb - 将 mgo 与转换为 map[string]interface{} 的嵌套文档一起使用。如何遍历 map ?

c - 使用 fgets() 将文件中的行读取到结构数组中导致的段错误

c - 错误: dereferencing pointer to incomplete type -> passing structure to module