C массивы может содержать дополнение промежуточные элементы?

Есть одна вещь, что IntelliJ делает намного лучше, чем Eclipse, и это пустые карманы!

Я, однако, предпочитаю использовать его, и у него есть одно большое преимущество перед Eclipce в том, что он синхронизируется с файловой системой, для больших проектов и медленных компьютеров (да, в рабочих средах ПК работают намного медленнее, чем наши дома) Eclipse, похоже, борется там, где IntelliJ кажется более быстрым, хотя и с более медленным начальным временем индексации.

Редакция IntelliJ Community, очевидно, делает его бесплатным, но вскоре вы захотите, чтобы этот дополнительный рефакторинг и приятные маленькие вкусности не были включены в редакцию CC.

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

Но давайте будем благодарны, что у нас есть до трех отличных IDE для Java прямо сейчас, и NetBeans постоянно улучшается.

25
задан E.M. 1 July 2009 в 00:14
поделиться

5 ответов

Нет, никогда не будет отступов между элементами массива. Это специально не разрешено. Стандарт C99 называет типы массивов «Тип массива описывает непрерывно выделенный непустой набор объектов ...». Напротив, структура выделяется «последовательно», а не «непрерывно».

Может быть заполнение до или после массива в структуре; это совершенно другое животное. Компилятор может сделать это для облегчения выравнивания структуры, но в стандарте C об этом ничего не говорится.

31
ответ дан 28 November 2019 в 21:08
поделиться

Осторожно. Заполнение может быть добавлено в конце структуры, но не будет добавлено между элементами массива, как вы указываете в своем вопросе. Массивы всегда будут ссылаться на непрерывную память, хотя массив структур может иметь заполнение, добавленное к каждому элементу как часть самой структуры.

В вашем примере значения и foo.values ​​ ] массивы будут иметь одинаковый размер. Вместо этого любое заполнение будет частью структуры foo .

8
ответ дан 28 November 2019 в 21:08
поделиться

Вот объяснение , почему структура может нуждаться в заполнении между ее членами или даже после последнего члена, и почему массив этого не делает:

Различные типы могут иметь другие требования к выравниванию. Некоторые типы необходимо выровнять по границам слов, другие - по границам двойных или даже четверных слов. Для этого структура может содержать байты заполнения между своими членами. Завершающие байты заполнения могут потребоваться, потому что расположение в памяти непосредственно после структуры также должно соответствовать требованиям выравнивания структуры, то есть, если bar имеет тип struct foo * , то

(struct foo *)((char *)bar + sizeof(struct foo))

дает действительный указатель на struct foo (т.е. не дает сбоя из-за неправильного выравнивания).

Поскольку каждый «член» массива имеет одинаковое требование выравнивания, нет причин вводить отступы. Это верно и для массивов, содержащихся в структурах: если первый элемент массива правильно выровнен, то же самое касается и всех следующих элементов.

3
ответ дан 28 November 2019 в 21:08
поделиться

Да, вроде того. Переменные часто выравниваются по какой-либо границе, в зависимости от переменной. Возьмем, к примеру, следующее:

typedef struct
{
    double d;
    char c;
} a_type_t;

double и char - это 8 и 1 байт в моей системе соответственно. Итого 9. Эта структура, однако, будет иметь размер 16 байт, так что двойники всегда будут выровнены по 8 байт. Если бы я просто использовал целые числа, символы и т. Д., То выравнивание могло бы быть 1, 2, 4 или 8.

Для некоторого типа T sizeof (T) может быть равно или не равняться ] sizeof (Ta) + sizeof (Tb) + sizeof (Tc) ... и т.д.

Как правило, это полностью зависит от компилятора и архитектуры. На практике это не имеет значения.

1
ответ дан 28 November 2019 в 21:08
поделиться

Consider:

struct {
  short s;
  int i;
} s;

Assuming shorts are 16 bits and you're on 32 bits, the size will probably be 8 bytes as each struct members tends to be aligned a word (32 bit in this case) boundary. I say "probably" because it is implementation specific behaviour that can be varied by compiler flags and the like.

It's worth stressing that this is implementation behaviour not necessarily defined by the C standard. Much like the size of shorts, ints and longs (the C standard simply says shorts won't be larger than ints and longs won't be smaller than ints, which can end up as 16/32/32, 16/32/64, 32/32/64 or a number of other configurations).

0
ответ дан 28 November 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: