Чтобы ответить на ваш вопрос, да, есть платформы, где это может вызвать проблемы.Поскольку вы специально упоминаете, что оно будет отправлено на графический процессор, это может быть проблематично для некоторых архитектур.Недавно я столкнулся с этой проблемой с Metal на macOS, где я хотел уменьшить свои данные на 25%, поэтому отправлял только (x, y, z) вместо (x, y, z, 1.0) для моих координат текстуры и результата.было то, что все координаты были выключены.(Я полагаю, что проблема заключалась в том, что архитектура GPU предполагала определенное заполнение, которое не обеспечивала архитектура CPU, хотя я думаю, что это дало бы аналогично плохие результаты, если бы было верно обратное.)
Решение для перекрестногоСовместимость платформы, вероятно, заключается в определении макроса, обеспечивающего правильное заполнение для каждого используемого компилятораЗатем при определении структуры данных используйте этот макрос, чтобы получить правильное заполнение.Таким образом, это выглядело бы примерно так:
#if MSVC
#define PACK_TIGHTLY <MSVC-specific definition of tight packing>
#define END_PACK_TIGHTLY <MSVC-specific definition of ending tight packing>
#elif Clang
#define PACK_TIGHTLY <clang-specific definition of tight packing>
#define END_PACK_TIGHTLY <clang-specific definition of ending tight packing>
#elif
// ... etc. for other platforms you want to support
#endif
Тогда при определении вашего struct
вы бы сделали что-то вроде:
PACK_TIGHTLY
struct FloatStruct
{
FloatStruct() :
a(1.f), b(10.f), c(100.f), d(1000.f), e(10000.f) { }
float a;
float b;
float c;
float d;
float e;
};
END_PACK_TIGHTLY