可能的重复:
“struct hack”在技术上是未定义的行为吗?
我检查了 C++11 中是否允许零长度数组。看来他们不是。从8.3.4 Arrays [dcl.array]
如果存在常量表达式(5.19),则它应是整型常量表达式,并且其值应大于零。
由于我不能使用零长度数组,是否可以在标准/定义良好的情况下使用可变长度结构?例如,我想做如下的事情。当缓冲区可能为空时,如何使其定义明确并成为标准。
-编辑-相关:零长度数组
struct MyStruct {
uint size;
int32 buf[0];//<-- NonStandard!
};
...
auto len=GetLength();
auto ptr=GetPtr();
auto bytelen=len*sizeof(int32);
var p = reinterpret_cast<MyStruct*>(malloc(bytelen))
p->size=len
memcpy(p->buf, ptr, bytelen)
return p;
这是 C++,而不是 C。在 C++ 中,您不需要这种灵活的数组成员 hack,因为您可以轻松地创建一个模板类,该模板类可以为任何结构赋予超出末尾的灵活数组,并封装指针算术计算和内存分配使其发挥作用。手表:
#include <cstring>
template <typename STRUCT, typename TYPE> class flex_struct {
public:
TYPE *tail()
{
return (TYPE *) ((char *) this + padded_size());
}
// substitute malloc/free here for new[]/delete[] if you want
void *operator new(size_t size, size_t tail)
{
size_t total = padded_size() + sizeof (TYPE) * tail;
return new char[total];
}
void operator delete(void *mem)
{
delete [] (char *) mem;
}
private:
static size_t padded_size() {
size_t padded = sizeof (flex_struct<STRUCT, TYPE>);
if(padded % alignof(TYPE) != 0) {
padded = padded & ~(alignof(TYPE)-1) + alignof(TYPE);
}
return padded;
}
};
struct mystruct : public flex_struct<mystruct, char> {
int regular_member;
};
int main()
{
mystruct *s = new (100) mystruct; // mystruct with 100 chars extra
char *ptr = s->tail(); // get pointer to those 100 chars
memset(ptr, 0, 100); // fill them
delete s; // blow off struct and 100 chars
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)