WedX - журнал о программировании и компьютерных науках

Составление членов во время компиляции

У меня есть куча атрибутов, которые могут быть либо NOP, либо иметь состояние. Требование к ним состоит в том, чтобы не иметь никакого размера, когда пользователю не нужен атрибут, но все же содержать определенные методы. Пример:

struct AttributeATag {};

/* The template used when AttributeATag is not specified */
template <typename T>
class AttributeA
{
public:
    void foo(uint32_t v)
    {
        // Nop, do nothing
    }

    enum
    {
        HasAttributeA = false
    };
};

/* The template specialization used when AttributeATag is specified */
template <>
class AttributeA<AttributeATag>
{
public:
    void foo(uint32_t v)
    {
        this->omgVariable = v;
    }

    enum
    {
        HasAttributeA = true
    };
protected:
    int omgVariable;
};

template <typename ATag>
class MyUberClass : public AttributeA<ATag>
{
    // This class now has omgVariable or not, depending on ATag and it
    // has either a NOP method or one which actually does something
    void doSomething()
    {
        if (AttributeA<ATag>::HasAttributeA)
        {
            /* ... */
        }
    }
};

Это работает, но теперь есть проблема: размер атрибутов NOP, хотя они и являются пустыми классами, не равен 0, а это означает, что 100 пустых атрибутов добавляют много неиспользуемого пространства в MyUberClass.

Есть ли способ избежать этого и добавлять/удалять переменные-члены на основе параметра шаблона?


РЕДАКТИРОВАТЬ:

Насколько я знаю, пустые классы не имеют размера 0. Когда я пытаюсь сделать следующее, я получаю sizeof(B) == 4.

template <typename T>
class A
{

};

class B : public A<int>, public A<double>, public A<char>, public A<long>, public A<bool>
{

};

  • AttributeA<ATag> будет иметь размер, только если ATag = AttributeTag. Остальные случаи будут только пустым классом. Также откуда взялось это число 100? Я не вижу никакой проблемы. Пожалуйста, сформулируйте свой вопрос ясно. 19.03.2012
  • 100 просто придумано, чтобы преувеличить проблему. 19.03.2012

Ответы:


1

Поскольку вы используете AttributeA в качестве базового класса, почти каждый компилятор будет использовать «оптимизацию пустой базы», ​​чтобы убедиться, что пустой базовый класс не использует пространство внутри дочернего класса, даже если размер базового класса не равен нулю. Я не верю, что у тебя здесь проблемы.

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

19.03.2012
  • Я только что запустил свой EDIT (см. мой пост), используя MSVC 10, и sizeof (B) по-прежнему возвращает 4 при компиляции в выпуске. Вы уверены, что это оптимизируется? 19.03.2012
  • Я думаю, что это проблема с моим компилятором. Он должен применить оптимизацию пустого базового класса, но по какой-то причине MSVC10 делает это только для первого базового класса и добавляет 1 байт для остальных. 19.03.2012

  • 2

    в этом тесте:

    #include <iostream>
    struct g{};
    int main()
    {
        std::cout << sizeof(g) << std::endl;
    }
    

    на gcc я получаю размер 1, это, вероятно, потому, что вам все равно нужно иметь указатель на него независимо от того, сохраняет ли он состояние.

    Я не думаю, что это далеко вокруг него, не прибегая к чему-то другому, кроме класса.

    19.03.2012
  • Что-то кроме класса? Что бы это было? 19.03.2012
  • @HowieHowitzer Боюсь, на чем заканчивается мой ответ. Возможно, другой дизайн, но это не все, что полезно, извините. 19.03.2012

  • 3

    Пустой класс будет иметь минимальный размер 1 байт, независимо от того, какое количество (пустых) классов унаследовано или нет.
    В вашем примере class B будет иметь минимальный размер, определяемый реализацией (который кажется 4 байта в вашем случае), наследуете ли вы от других классов или не наследуете.

    Это необходимо для того, чтобы любой пустой объект class мог иметь уникальный адрес. С этим ничего нельзя поделать.

    19.03.2012
  • Это не тот случай, поскольку sizeof(A‹int›) == 1. Это означает, что пустые классы имеют размер 1 байт с использованием моего компилятора (MSVC10), поэтому с sizeof(B) == 4 ясно, что пустые классы действительно добавьте к размеру B. 19.03.2012
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    © 2024 wedx.ru, WedX - журнал о программировании и компьютерных науках
    Для любых предложений по сайту: [email protected]