У предыдущего работодателя мы писали двоичные сообщения, которые должны были передаваться «по проводам» на другие компьютеры. Каждое сообщение имеет стандартный заголовок что-то вроде:
class Header
{
int type;
int payloadLength;
};
Все данные были смежными (заголовок, за которым сразу следуют данные). Мы хотели получить полезную нагрузку, учитывая, что у нас есть указатель на заголовок. Традиционно вы можете сказать что-то вроде:
char* Header::GetPayload()
{
return ((char*) &payloadLength) + sizeof(payloadLength);
}
или даже:
char* Header::GetPayload()
{
return ((char*) this) + sizeof(Header);
}
Это казалось многословным, поэтому я придумал:
char* Header::GetPayload()
{
return (char*) &this[1];
}
Сначала это кажется довольно тревожным, возможно, слишком странным для использования - но очень компактным.
Было много споров о том, было ли это гениальным или мерзостью.
Так что же это - преступление против кодирования или хорошее решение? У вас когда-нибудь был подобный компромисс?
-Обновление:
Мы попробовали массив нулевого размера, но в то время компиляторы давали предупреждения.
В конце концов мы перешли к унаследованной технике: сообщение происходит от заголовка.
На практике это прекрасно работает, но в принципе вы говорите сообщение IsA Header - что кажется немного неловким.