gpt4 book ai didi

c++ - 使用 new 分配一个长度为零的结构

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:58:38 25 4
gpt4 key购买 nike

在 C 中(使用 gcc)我可以声明一个可变长度的结构,如下所示:

typedef struct ProtocolFrame
{
uint8_t op;
uint32_t address;
uint16_t size;
uint8_t payload[0];
} ProtocolFrame;

然后我可以分配不同的框架:

ProtocolFrame *frA;
ProtocolFrame *frB;

frA = malloc(sizeof(ProtocolFrame) + 50);
frB = malloc(sizeof(ProtocolFrame));

在这个例子中,frA 有一个 50 字节的有效负载字段,而 frB 没有有效负载

我可以使用 new 运算符在 C++ 中做同样的事情吗?

最佳答案

template<size_t s>
struct ProtocolFrame
{
uint8_t op;
uint32_t address;
uint16_t size;
uint8_t payload[s];
} ProtocolFrame;

// specialize for no payload
template<>
struct ProtocolFrame<0>
{
uint8_t op;
uint32_t address;
uint16_t size;
} ProtocolFrame;

ProtocolFrame<50> *frA = new ProtocolFrame<50>;
ProtocolFrame<0> *frB = new ProtocolFrame<0>;

要确定运行时的大小,您可以结合使用 placement-new 运算符和 std::malloc:

void *buffer = std::malloc(sizeof(ProtocolFrame)+50);
ProtocolFrame *frA = new (buffer) ProtocolFrame;

您还可以阅读 this article在包含完整示例的 codeproject.com 上。

关于c++ - 使用 new 分配一个长度为零的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4517838/

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