首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >两个成员的结构是位压缩int的安全替代品吗?

两个成员的结构是位压缩int的安全替代品吗?
EN

Stack Overflow用户
提问于 2019-05-21 02:51:40
回答 1查看 153关注 0票数 4

我有一些现有的通过网络发送和接收uint32_t数组的C++代码。由于我的协议发生了变化,我想用一对两个uint16_t替换这个数组中的每个条目,如果可能的话,我想在不改变我通过网络发送的位数的情况下这样做。将两个uint16_t值组合成单个32位宽值的一种显而易见的方法是将低级位打包到uint32_t中,并保持数组定义不变。因此,发送者的代码将如下所示:

代码语言:javascript
运行
复制
uint32_t items[ARR_SIZE];
for(std::size_t i = 0; i < ARR_SIZE; ++i) {
    //get uint16_t field1 and field2 somehow
    items[i] = static_cast<uint32_t>(static_cast<uint32_t>(field2) << 16)
                   | static_cast<uint32_t>(field1));
}

接收器的代码将如下所示:

代码语言:javascript
运行
复制
//receive items
for(std::size_t i = 0; i < ARR_SIZE; ++i) {
    uint16_t field1 = static_cast<uint16_t>(items[i] & 0xffff);
    uint16_t field2 = static_cast<uint16_t>(items[i] >> 16);
    //do something with field1 and field2
}

然而,这是丑陋的、类型不安全的,并且依赖于硬编码的幻数。我想知道是否有可能通过定义一个与uint32_t大小完全相同的2成员结构来完成同样的事情

代码语言:javascript
运行
复制
struct data_item_t {
    uint16_t field1;
    uint16_t field2;
};

然后,发送者的代码将如下所示:

代码语言:javascript
运行
复制
data_item_t items[ARR_SIZE];
for(std::size_t i = 0; i < SIZE; ++i) {
    //get uint16_t field1 and field2 somehow
    items[i] = {field1, field2};
}

接收器的代码将如下所示:

代码语言:javascript
运行
复制
//receive items
for(std::size_t i = 0; i < ARR_SIZE; ++i) {
    uint16_t curr_field1 = items[i].field1;
    uint16_t curr_field2 = items[i].field2;
    //do something with field1 and field2
}

这是否等同于比特打包的uint32_t?换句话说,当我使用struct data_item_t时,项数组是否会包含与我使用uint32_t和位打包时相同的位?基于the rules of structure padding,我认为包含两个uint16_t的结构永远不需要任何内部填充来正确对齐。或者这实际上取决于我的编译器,而我需要像__attribute__((__packed__))这样的东西来保证它?

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56226597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档