2014-12-31 6 views
8

Я реализовал зубчатый многомерный массив, выделив пространство для промежуточных массивов , а также фактические элементы в большой блок. Во время работы над этим я решил, что на всякий случай должен был учитывать выравнивание хранящихся элементов. Но я не уверен, нужна ли проверка безопасности, поэтому я пришел спросить: будет ли размер указателя поддерживать выравнивание для любого другого типа?C указатели могут быть выровнены с любым другим типом данных?

Короче говоря: Учитывая пространство непрерывной памяти из вызова таНос, который выглядит как:

| ARRAY OF POINTERS | ALIGN PADDING | ARRAY OF AN ARBITRARY ELEMENT TYPE | 

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

+0

'Будет ли размер указателя поддерживать выравнивание для любого другого типа? Это правда в большинстве случаев, но мне любопытно, гарантировано ли оно стандартом C или нет. +1 – ikh

+0

У вас может быть указатель на 32 бита, при сохранении значений 64 бит. С нечетным количеством значений требуется отступы. – Macmade

+0

Вы не должны «нуждаться» в дополнении к тому, что требуется для выравнивания по размеру слова вашего процессора. Вы можете получить небольшое ускорение, совместив вещи на более широкой границе. –

ответ

2

Стандарт C явно не гарантирует, что указатели объектов имеют самые строгие требования к выравниванию. В некоторых системах long double может иметь более строгие требования к выравниванию; в других системах указатели на функции могут иметь более строгие требования к выравниванию.

Однако, с небольшой осторожностью и вниманием, вы можете определить требования к выравниванию. Вам нужно решить, насколько переносимым и автоматическим вам нужен ответ. Легко найти ответ, скомпилировав код и найдя ответ. Намного сложнее создать надежный автоматический способ сделать это автоматически для любого типа, не в последнюю очередь потому, что произвольный тип элемента может быть больше или меньше, чем указатель на объект.

2

Вы не указали все необходимые данные, необходимые для ответа на этот вопрос.

Так вот пример, где обивка необходимо:

struct Element 
{ 
    unsigned long long x; 
    ... 
}; 

void* ptrArray[TOTAL_SIZE]; 

Если вы работаете на 32-битной платформе И вы определили нечетное число указателей, то вы будете нуждаться в 4- заполнение байтов, чтобы обеспечить выравнивание 8-байтовой переменной в начале каждого элемента.

Кроме того, обратите внимание, что если вы хотите хранить больше одного элемента в массиве, размер самого элемента должен быть кратным 8 байтам, чтобы это работало.

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

+0

Я переформулировал вопрос, надеюсь, это яснее! –

Смежные вопросы