Определение смещения байта члена структуры во время компиляции?

Я хочу найти смещение байта члена структуры во время компиляции. Например:

struct vertex_t
{
vec3_t position;
vec3_t normal;
vec2_t texcoord;
}

Я хотел бы знать, что смещение байта normal есть (в этом случае должно быть 12.)

Я знаю, что я мог бы использовать offsetof, но это функция времени выполнения, и я бы предпочел не использовать ее.

Возможно ли то, что я пытаюсь достичь, возможно?

РЕДАКТИРОВАТЬ: offsetof это время компиляции, мой плохой!

7

Решение

offsetof константа времени компиляции, если мы посмотрим на черновик стандартного раздела C ++ C.3 C стандартная библиотека параграф 2 говорит:

Стандартная библиотека C ++ предоставляет 57 стандартных макросов из библиотеки C, как показано в таблице 149.

и таблица включает в себя offsetof, Если мы перейдем к разделу проекта стандарта C99 7.17 Общие определения параграф 3 включает в себя:

offsetof (тип, член-указатель)

который расширяется до целочисленного константного выражения, имеющего тип size_t, значение
который является смещением в байтах […]

7

Другие решения

Вы уверены, что это время выполнения?

Следующие работы ..

#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 во время компиляции

1

В С:

offsetof обычно является макросом, и, благодаря его определению, он, вероятно, будет оптимизирован компилятором, чтобы он уменьшился до постоянного значения. И даже если оно становится выражением, оно достаточно мало, чтобы не вызывать почти никаких накладных расходов.

Например, в файле stddef.hэто определяется как:

#define offsetof(st, m) ((size_t)(&((st *)0)->m))

В C ++:

Все становится немного сложнее, так как он должен разрешать смещения для членов как методов и других переменных. Так offsetof определяется как макрос для вызова другого метода:

#define offsetof(st, m) __builtin_offsetof(st, m)

Если вам это нужно только для структур, вы достаточно хорошо offsetof, Иначе, я не думаю, что это возможно.

1
По вопросам рекламы [email protected]