我已经接管了一些代码,并遇到了一个奇怪的数组重新分配。这是 Array 类中的一个函数(由 JsonValue 使用)
void reserve( uint32_t newCapacity ) {
if ( newCapacity > length + additionalCapacity ) {
newCapacity = std::min( newCapacity, length + std::numeric_limits<decltype( additionalCapacity )>::max() );
JsonValue *newPtr = new JsonValue[newCapacity];
if ( length > 0 ) {
memcpy( newPtr, values, length * sizeof( JsonValue ) );
memset( values, 0, length * sizeof( JsonValue ) );
}
delete[] values;
values = newPtr;
additionalCapacity = uint16_t( newCapacity - length );
}
}
我明白了这一点;它只是分配一个新数组,并将旧数组中的内存内容复制到新数组中,然后将旧数组的内容归零。我也知道这样做是为了防止调用析构函数和移动。
这JsonValue
是一个具有函数的类,以及一些存储在联合中的数据(字符串、数组、数字等)。
我担心的是这是否是实际定义的行为。我知道它有效,并且自从我们几个月前开始使用它以来就没有出现过问题;但如果它未定义,则并不意味着它会继续工作。
编辑:
JsonValue
看起来像这样:
struct JsonValue {
// …
~JsonValue() {
switch ( details.type ) {
case Type::Array:
case Type::Object:
array.destroy();
break;
case Type::String:
delete[] string.buffer;
break;
default: break;
}
}
private:
struct Details {
Key key = Key::Unknown;
Type type = Type::Null; // (0)
};
union {
Array array;
String string;
EmbedString embedString;
Number number;
Details details;
};
};
where是sArray
数组的包装器, is a ,is ,是, 和 的并集,包含它所持有的值的类型。所有值的开头都有 16 位未使用的数据,用于. 例子:JsonValue
String
char*
EmbedString
char[14]
Number
int
unsigned int
double
Details
Details
struct EmbedString {
uint16_t : 16;
char buffer[14] = { 0 };
};