Размер класса, содержащего только константы времени компиляции - PullRequest
3 голосов
/ 12 июля 2010

Если у меня есть класс, который содержит только константы времени компиляции, например,

class A {
    static const int x = 1;
    static const int y = 2;
    static const int z = 3;
};

Я полагаю, что это тот случай, когда адрес констант не берется, они могут (будет?) заменен во время компиляции, где они используются, и не будет занимать никакого места в исполняемом файле (то есть, как константы, то есть, очевидно, сами числа должны будут отображаться).Если это так, может ли класс быть оптимизирован?И изменится ли это, если что-то наследуется от class A, но все еще использует только сами константы и не берет их адреса?

О, и, предполагая, в версии без наследования, что класс не являетсяфактически использовал себя где угодно, кроме как в качестве средства для доступа к константам.

Спасибо.

Ответы [ 4 ]

7 голосов
/ 12 июля 2010

Не имеет значения, являются ли эти переменные const;они static, поэтому они не влияют на размер класса в любом случае.

sizeof(A) не может быть нулем, поэтому если вы создаете экземпляр A, он должен быть как минимум один байтпо размеру.Однако наличие A в качестве базового класса не обязательно увеличивает размер производного класса, поскольку «подобъекты базового класса могут иметь нулевой размер» (C ++ 03 §1.8 / 5).

3 голосов
/ 12 июля 2010

Используемое пространство

Нет, статическому члену const int не будет выделено пространство для них, поскольку они оцениваются как константы времени компиляции.

Что касается размера объекта класса(т. е. sizeof(A)), это не имеет значения, если вы не создаете экземпляры класса А., который вы явно заявили, что это не так.

Вместо этого используйте пространство имен ?

Тем не менее, возможно, вы могли бы вместо этого использовать namespace , чтобы сделать ваше намерение более ясным?Если вы не используете его для чего-то вроде черт шаблона, кажется, что вы злоупотребляете class , чтобы сделать пространства имен заданий предназначенными для.

1 голос
/ 12 июля 2010

Размер задан только потому, что даже объект такого класса должен иметь размер .(Для начала, если два таких объекта являются членами другого объекта, будут ли они иметь разные адреса, если вы создадите для них указатели на члены?) Когда этот класс используется в качестве базового класса, он получит выгоду от пустого оптимизация базового класса и будет уменьшена до размера 0. На самом деле, это

#include <iostream>

struct A {};
struct B { char x; };
struct C : public A, public B {};

int main()
{
    std::cout << sizeof(A) << '\n';
    std::cout << sizeof(B) << '\n';
    std::cout << sizeof(C) << '\n';
    return 0;
}

печатает

1
1
1

для меня, поэтому A не способствуетчто-нибудь размером C, что, кажется, подтверждает мою интерпретацию того, что размер A 1 является искусственным.

1 голос
/ 12 июля 2010

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

Раздел 5.3.3 проекта стандарта C ++ 0x, где это продиктовано:

При применении к классу результатом является число байтов в объекте этого класса, включая любые отступы, необходимые для размещенияобъекты этого типа в массиве.Размер самого производного класса должен быть больше нуля.

Они не должны влиять на размер экземпляра (так как они статические), но им, вероятно, понадобитсяхраниться где-то в исполняемом файле, так как вы должны иметь возможность использовать оператор адреса в них.Возможность их оптимизации вне существования полностью зависит от компилятора и от того, сможет ли он сказать, что на них не ссылаются.Перечисления, вероятно, являются лучшим инструментом для использования в данном конкретном случае.

Однако три целых числа в приложении вряд ли вызовут проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...