Я вижу много проблем с этим кодом.
//is this next line wrong?
//if((alignof(STRUCT)%reinterpret_cast<size_t>(buff))!=0) { throw std::exception(); }
return reinterpret_cast<STRUCT*>(buff);
Память, возвращаемая из new char[n]
, правильно выровнена для объектов запрошенного размера или меньше. Однако статические и автоматические char
массивы не являются. Так что, если вы всегда передаете что-то, выделенное new char[n]
, проблем нет. Если вы передадите указатель на статический или автоматический массив, то выравнивание действительно является проблемой.
struct struct_with_array : public STRUCT { TYPE buf[1]; };
Индексирование вне границ массива - неопределенное поведение. Существует только один элемент buf
, к которому вы можете получить доступ. Обратите внимание, что эта проблема не возникает в коде в исходном ответе.
auto p = reinterpret_cast<struct_with_array*>(this);
Я не совсем уверен в действительности этого броска, но подозреваю, что он нарушает строгий псевдоним.
auto srcarray=new char[1024];
memset(srcarray, 0, sizeof(srcarray)); //whats a C++ way to do this w/o writing a loop or function?
Путь C ++ был бы std::vector<char>(1024);
, наверное. В любом случае sizeof(srcarray)
, вероятно, не 1024, а, вероятно, 4 или 8 (равно sizeof(char*)
).
auto v = MyVariableLengthStruct::head(srcarray);
Никогда не было построено MyVariableLengthStruct
в памяти, указанной srcarray
, так что это будет работать только для типов POD.