我读过 offsetof 宏通常实现为:
#define offsetof(st, m) \
((size_t)&(((st *)0)->m))
根据维基百科的说法,这是否是未定义的行为存在争议,因为它可能会取消引用指针。我有一个需要发送到不同地方的信息缓冲区,但缓冲区只占用结构的一部分。我想知道是否保证以下内容可以将我的结构的正确大小提供到缓冲区的末尾,即最后一个成员。
struct PerObjBuffer
{
mat4 matrix;
mat4 otherMatrix;
vec4 colour;
int sampleType = 0;
size_t getBufferSize() { return offsetof(PerObjBuffer, sampleType) + sizeof(sampleType); }
void sendToGPU() { memcpy(destination, this, getBufferSize()); }
String shaderStringCode =
R"(layout(binding = 2, std140) uniform perObjectBuffer
{
mat4 WVPMatrix;
mat4 worldMatrix;
vec4 perObjColour;
int texSampleFormat;
};
)";
}
如果使用 offsetof 不是一个好主意,那么做我想做的最好的方法是什么?
编辑: sizeof(PerObjBuffer) - sizeof(String) 怎么样?我是否必须考虑填充问题?