выравнивание и массивы
От: Аноним  
Дата: 02.02.08 22:05
Оценка:
поправьте меня пожалуйста, а то я что-то запутался..

Для оптимизации доступа к данным, на всех платформах, применяется выравнивание данных, т.е. расположение данных по стартовым адресам, кратным величине выравнивания, иначе, получаем пени за обращение по некратным адресам, или даже падения, на некоторых платформах. => элементы массивов, должны располагаться так же с выравниванием, но это не так почему же?

и вот еще

Пусть у меня есть бинарный файл, в котором находится порядка 10^6 структуры данных, с 30 полями в каждой структуре, естественно с выравниванием == 1. Необходимо последовательно считать все эти структуры, и подсчитать некие параметры...
Вопрос, стоит ли перепаковывать данные после прочтение в стандартное выравние на платформе и уж потом оперировать с ними? А как быть на платформах, где обращение по невыравненному полю приводит к краху?
Re: выравнивание и массивы
От: remark Россия http://www.1024cores.net/
Дата: 02.02.08 23:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Для оптимизации доступа к данным, на всех платформах, применяется выравнивание данных, т.е. расположение данных по стартовым адресам, кратным величине выравнивания, иначе, получаем пени за обращение по некратным адресам, или даже падения, на некоторых платформах. => элементы массивов, должны располагаться так же с выравниванием, но это не так

почему же?

Элементы массива располагаются с тем же выравниваем, что и отдельные переменные.


А>Пусть у меня есть бинарный файл, в котором находится порядка 10^6 структуры данных, с 30 полями в каждой структуре, естественно с выравниванием == 1. Необходимо последовательно считать все эти структуры, и подсчитать некие параметры...

А>Вопрос, стоит ли перепаковывать данные после прочтение в стандартное выравние на платформе и уж потом оперировать с ними? А как быть на платформах, где обращение по невыравненному полю приводит к краху?

Это зависит. Зависит много от чего. Такие вопросы крайне архитектурно-зависимы. Так же будет влиять конкретная раскладка структуры. Проще всего тут просто замерить конкретные варианты.
Тем не менее интуиция подсказывает, что перепаковка замедлит работу. По крайней мере на x86.



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: выравнивание и массивы
От: Аноним  
Дата: 03.02.08 09:42
Оценка:
R>Элементы массива располагаются с тем же выравниваем, что и отдельные переменные.

видимо я что-то не понимаю
почему под виндой из msvs 2003 код
#include <iostream>
#pragma pack(8)

int main() {
    char a_c[2];
    int  a_i[2];
    struct s_c{char c1; char c2;} s_c_o;
    struct s_i{int i1; int i2;} s_i_o;
    struct s_c_i{char c1; int i2;} s_c_i_o;


    std::cout << "a_c =>   size: " << sizeof (a_c) << "\tdiff: " << (int)&a_c[1] - (int)&a_c[0] << std::endl;    
    std::cout << "a_i =>   size: " << sizeof (a_i) << "\tdiff: " << (int)&a_i[1] - (int)&a_i[0] << std::endl;    

    std::cout << "s_c =>   size: " << sizeof (s_c) << "\tdiff: " << (int)&s_c_o.c2 - (int)&s_c_o.c1 << std::endl;    
    std::cout << "s_i =>   size: " << sizeof (s_i) << "\tdiff: " << (int)&s_i_o.i2 - (int)&s_i_o.i1 << std::endl;    
    std::cout << "s_c_i => size: " << sizeof (s_c_i) << "\tdiff: " << (int)&s_c_i_o.i2 - (int)&s_c_i_o.c1 << std::endl;    



    return 0;
}


дает на выходе:
a_c =>   size: 2    diff: 1
a_i =>   size: 8    diff: 4
s_c =>   size: 2    diff: 1
s_i =>   size: 8    diff: 4
s_c_i => size: 8    diff: 4


1. правильно я понимаю, чтоо на однотипные типы выравнивание не распостраняется?
2. почему в структуре s_c_i размер 8? ведь выравнивание стоит в 8, и вроде бы как размер должен быть 12?
Re[3]: выравнивание и массивы
От: remark Россия http://www.1024cores.net/
Дата: 03.02.08 10:17
Оценка:
Здравствуйте, Аноним, Вы писали:

R>>Элементы массива располагаются с тем же выравниваем, что и отдельные переменные.


А>видимо я что-то не понимаю

А>1. правильно я понимаю, чтоо на однотипные типы выравнивание не распостраняется?
А>2. почему в структуре s_c_i размер 8? ведь выравнивание стоит в 8, и вроде бы как размер должен быть 12?


#pragma pack(8) ставить не обязательно — выравнивание и так по-умолчанию 8.
Выравнивание для члена выбирается как *минимум* из установленного выравнивания и размера члена.

Если хочешь зафиксировать нужную тебе бинарную раскладку структуры, то лучше установи наоборот #pragma pack(1) и вручную добавь между членами "прослойки" нужных размеров из char[].



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: выравнивание и массивы
От: Erop Россия  
Дата: 03.02.08 16:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>видимо я что-то не понимаю

Видимо так.
Вот тут
Автор: Erop
Дата: 28.10.05
я однажды описывал то, чего ты не понимаешь
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: выравнивание и массивы
От: Vain Россия google.ru
Дата: 03.02.08 16:51
Оценка:
Здравствуйте, Erop, Вы писали:

E>Вот тут
Автор: Erop
Дата: 28.10.05
я однажды описывал то, чего ты не понимаешь

template<typename T>
class Align {
    struct AlignStruct {
        char forAlign;
        T t;
    };
public:
    enum { Result = sizeof( AlignStruct ) - sizeof( T ) };
};


Это не работает в случае если T — абстрактный тип. Здесь
Автор: Vain
Дата: 28.01.08
— решение.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[5]: выравнивание и массивы
От: Erop Россия  
Дата: 03.02.08 17:23
Оценка:
Здравствуйте, Vain, Вы писали:

V>Это не работает в случае если T — абстрактный тип. Здесь
Автор: Vain
Дата: 28.01.08
— решение.


Зато это проще и яснее для объяснений
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: такая конструкция?
От: Programador  
Дата: 16.06.08 20:14
Оценка:
sizeof(T [1]) всегда равно sizeof(T ) или от paсk зависит?
Re[2]: такая конструкция?
От: Erop Россия  
Дата: 17.06.08 05:42
Оценка:
Здравствуйте, Programador, Вы писали:

P>sizeof(T [1]) всегда равно sizeof(T ) или от paсk зависит?


AFAIK всегда.
Мало того, sizeof( Т ) всегда кратен выравниванию Т.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.