Я хочу найти смещение байта члена структуры во время компиляции. Например:
struct vertex_t
{
vec3_t position;
vec3_t normal;
vec2_t texcoord;
}
Я хотел бы знать, что смещение байта normal
есть (в этом случае должно быть 12
.)
Я знаю, что я мог бы использовать offsetof
, но это функция времени выполнения, и я бы предпочел не использовать ее.
Возможно ли то, что я пытаюсь достичь, возможно?
РЕДАКТИРОВАТЬ: offsetof
это время компиляции, мой плохой!
offsetof
константа времени компиляции, если мы посмотрим на черновик стандартного раздела C ++ C.3
C стандартная библиотека параграф 2 говорит:
Стандартная библиотека C ++ предоставляет 57 стандартных макросов из библиотеки C, как показано в таблице 149.
и таблица включает в себя offsetof
, Если мы перейдем к разделу проекта стандарта C99 7.17
Общие определения параграф 3 включает в себя:
offsetof (тип, член-указатель)
который расширяется до целочисленного константного выражения, имеющего тип size_t, значение
который является смещением в байтах […]
Вы уверены, что это время выполнения?
Следующие работы ..
#include <iostream>
#include <algorithm>struct vertex_t
{
int32_t position;
int32_t normal;
int32_t texcoord;
};
const int i = offsetof(vertex_t, normal); //compile time..
int main()
{
std::cout<<i;
}
Также смотрите здесь: offsetof во время компиляции
В С:
offsetof
обычно является макросом, и, благодаря его определению, он, вероятно, будет оптимизирован компилятором, чтобы он уменьшился до постоянного значения. И даже если оно становится выражением, оно достаточно мало, чтобы не вызывать почти никаких накладных расходов.
Например, в файле stddef.h
это определяется как:
#define offsetof(st, m) ((size_t)(&((st *)0)->m))
В C ++:
Все становится немного сложнее, так как он должен разрешать смещения для членов как методов и других переменных. Так offsetof
определяется как макрос для вызова другого метода:
#define offsetof(st, m) __builtin_offsetof(st, m)
Если вам это нужно только для структур, вы достаточно хорошо offsetof
, Иначе, я не думаю, что это возможно.