Размер массива C ++ в 64-битной или 32-битной среде - PullRequest
0 голосов
/ 12 октября 2010

предположим, что у меня есть класс, определенный следующим образом

class foo
{
    char [10] bar;
}

Как будет различаться размер этого класса в 64-битной среде по сравнению с 32-битной при условии отсутствия заполнения / упаковки.

Я считаю, что 64-битная версия класса будет иметь длину еще 4 байта, поскольку:

  1. Класс должен содержать символ *, чтобы указывать на начало строки массива
  2. символ * составляет 8 байтов в 64-битной среде против 4 байтов в 32-битной среде

Я прав?

Спасибо!

Еще один вопрос о том, как на самом деле работают массивы Если при объявлении массива не хранится указатель, почему вы можете получить адрес из имени массива и делать такие вещи, как bar [0], bar [1] и т. д.

Ответы [ 4 ]

4 голосов
/ 12 октября 2010

Нет, вы не. char [] bar; даже не скомпилируется, char bar[10]; - правильный синтаксис, и нет, указатель не сохраняется, sizeof (char) всегда равен 1, а sizeof bar будет равен 10, независимо от архитектуры.

Теперь к вашему дополнительному вопросу: Вы должны понимать понятия lvalue и rvalue и преобразований lvalue в rvalue. Обычно преобразования lvalue в rvalue "ничего не делают". Исключением является то, что преобразование lvalue в rvalue для массива T является преобразованием в указатель на T, который указывает на первый элемент массива.

Также объявление функции, принимающее массив T по значению, эквивалентно объявлению функции, принимающему указатель на T.

2 голосов
/ 12 октября 2010

Единственный способ увидеть разницу - это если компилятор решил вставить некоторые отступы после массива, чтобы при создании массива этих объектов каждый из них был бы хорошо выровнен.Например, для 32-разрядного целевого объекта он может дополнить его до 12 байтов, но вместо этого для 64-разрядного целевого объекта до 16 байт.

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

2 голосов
/ 12 октября 2010

sizeof (char) определяется как 1 в стандарте C ++, независимо от вашей архитектуры. Ваша структура представляет собой массив из 10 символов, а не указатель на массив.

Кроме того, правильное объявление будет char bar[10].

Вы, вероятно, думаете о char *bar - теперь это будет 4 байта против 8 байтов в 32-битном против 64-битном.

1 голос
/ 12 октября 2010

Приведенный вами пример не станет больше в 64-битной среде.

class foo
{
    char bar[10];
};

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

Многие классы выглядят болеекак это:

class foo2
{
public:
    char bar[10];
    virtual ~foo2() {}
};

Класс с любыми виртуальными членами, такими как foo2, будет расти с ростом размера указателя.Однако в большинстве компиляторов существует только один указатель независимо от того, сколько виртуальных членов.

В любом случае, большое значение имеет создание классов (> скажем, 20000 экземпляров).

...