Почему мой объект занимает 64 байта, а не 32? - PullRequest
1 голос
/ 17 ноября 2009

У меня есть класс, который выглядит так:

class myType
{

  union {
      float data[4];
      other_vector4_type v
  } ;
  typedef union {
      float data[4];
      other_vector4_type v
  } myType-internal_t;

 <various member functions, operator overloads>

}

Теперь я хочу использовать этот тип в моем буфере вершин, но sizeof() не так, как ожидалось. Я выровнял класс до 16 байт.

sizeof(myType) дает 64.

sizeof(myType::myType-internal_t) дает 32.

Я прочитал довольно много статей о выравнивании данных, но я не знаю, где я использую дополнительные данные. Я попытался удалить собственный конструктор, но он остался прежним, замена ключевого слова class на struct также не меняет его (я не понимаю, для чего он, как это происходит!)

Это раздражает, сейчас я буду использовать внутренний тип, так как я не буду часто касаться данных, но было бы здорово, чтобы класс работал так, как я хочу.

Ответы [ 4 ]

2 голосов
/ 17 ноября 2009

Компилятор C ++ может сделать эту структуру 128 байтов для всех своих забот. Размер структур / объединений не определяется стандартом C ++. Однако большинство компиляторов имеют нестандартный атрибут __PACKED, который вы можете добавить к объявлению структуры, и он будет занимать только точное количество байтов, которое ему нужно

1 голос
/ 17 ноября 2009

Я только что скомпилировал

#include <xmmintrin.h>
#include <iostream>

struct myType
{
    union {
        float data[4];
        __v4sf v;
    };
    typedef union {
        float data[4];
        __v4sf v;
    } myType_internal_t;
};

int main() {
    std::cout << sizeof(myType) << std::endl;
    std::cout << sizeof(myType::myType_internal_t) << std::endl;
}

И результат:

16
16

с использованием gcc на 64-битной арке. Как и ожидалось. «__v4sf» - это векторный тип, состоящий из четырех чисел с плавающей точкой. Так что проблема, вероятно, в вашем "other_vector_4_type". Может быть, он полиморфный и виртуальный и содержит две таблицы? И вы используете больше виртуальных функций в «myType», которые еще больше увеличивают его размер? Возможно, проблема связана с вашим компилятором или архитектурой.

1 голос
/ 17 ноября 2009

Я полагаю, у вас будет vtable указатель, определенный для ваших объектов. Либо потому, что у вас включен RTTI, либо любой виртуальный метод (включая деструктор) добавит vtable

http://en.wikipedia.org/wiki/Virtual_method_table

Как правило, компилятор создает отдельную таблицу для каждого класса. Когда объект создается, указатель на эту vtable, называемый указателем виртуальной таблицы или vpointer, добавляется как скрытый член этого объекта (становясь его первым членом, если он не сделан последним [2]). Компилятор также генерирует «скрытый» код в конструкторе каждого класса, чтобы инициализировать vpointers его объектов по адресу соответствующей vtable.

1 голос
/ 17 ноября 2009

Если у вас есть виртуальные функции в вашем классе, это сделает ваши объекты больше внутреннего типа из-за указателя vtable.

Кстати, "struct {" - это то же самое, что сказать "class {public:"

...