gpt4 book ai didi

c++ - 在C++中为 union 中的数组动态分配内存

转载 作者:行者123 更新时间:2023-12-03 07:16:09 25 4
gpt4 key购买 nike

我正在使用union来填充char型消息缓冲区中的某些消息字段。如果消息的长度是恒定的,则它可以正常工作。请参见下面的简化代码示例。

问题是,我的消息长度可能可变。具体来说,const N将在运行时确定。有没有一种方法可以通过为buf动态分配内存来继续使用联合?

我正在探索智能指针,但到目前为止还没有任何运气。

const int N = 4;

struct repeating_group_t {
uint8_t field1;
uint8_t field2;
}rpt_group;

struct message_t
{
union
{
char buf[2 + 2*N];
struct {
uint8_t header;
uint8_t block_len;
std::array<repeating_group_t, N> group;
};
};
};

int main()
{
message_t msg;

msg.header = 0x32;
msg.block_len = 8;

for (auto i = 0; i < N; i++)
{
msg.group[i].field1 = i;
msg.group[i].field2 = 10*i;
}

// msg.buf is correctly filled

return 0;
}

最佳答案

如评论中所述,使用std::vector

int main() {
// before C++17 use char
std::vector<std::byte> v.
v.push_back(0x32);
v.push_back(8);
for (auto i = 0; i < N; i++) {
v.push_back(i);
const uint16_t a = 10 * i;
// store uint16_t in big endian
v.push_back(a >> 16);
v.push_back(a & 0xff);
}
}

对于自定义数据类型,您可以提供自己的类似于流或类似于容器的容器,并重载 operator>>或为数据类型选择的另一个自定义函数。
struct Message{
std::vector<std::byte> v;
Message& push8(uint8_t t) { ... }
// push 16 bits little endian
Message& push16le(uint16_t t) { ... }
// push 16 bits big endian
Message& push16be(uint16_t t) { ... }
// etc
Message& push(const Repeating_group& t) {
v.push_back(t.field1);
v.push_back(t.field2);
return v;
}
// etc.
};

int main(){
Message v;
v.push8(0x32).push8(8);
for (...) {
v.push(Repeating_group(i, i * 10));
}
}

关于c++ - 在C++中为 union 中的数组动态分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61129868/

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