Недавно я немного узнал о выравнивании, но я не уверен, в каких ситуациях это будет проблемой или нет. Меня интересуют два случая:
Первый - при использовании массивов:
struct Foo {
char data[3]; // size is 3, my arch is 64-bit (8 bytes)
};
Foo array[4]; // total memory is 3 * 4 = 12 bytes.
// will this be padded to 16?
void testArray() {
Foo foo1 = array[0];
Foo foo2 = array[1]; // is foo2 pointing to a non-aligned location?
// should one expect issues here?
}
Второй случай заключается в использовании пула памяти:
struct Pool {
Pool(std::size_t size = 256) : data(size), used(0), freed(0) { }
template<class T>
T * allocate() {
T * result = reinterpret_cast<T*>(&data[used]);
used += sizeof(T);
return result;
}
template<class T>
void deallocate(T * ptr) {
freed += sizeof(T);
if (freed == used) {
used = freed = 0;
}
}
std::vector<char> data;
std::size_t used;
std::size_t freed;
};
void testPool() {
Pool pool;
Foo * foo1 = pool.allocate<Foo>(); // points to data[0]
Foo * foo2 = pool.allocate<Foo>(); // points to data[3],
// alignment issue here?
pool.deallocate(foo2);
pool.deallocate(foo1);
}
Мои вопросы:
- Есть ли проблемы с выравниванием в двух примерах кода?
- Если да, то как они могут быть исправлены?
- Где я могу узнать больше об этом?
Update
Я использую 64-разрядный процессор Intel i7 с Darwin GCC. Но я также использую Linux, Windows (VC2008) для 32-разрядных и 64-разрядных систем.
Обновление 2
В пуле теперь используется вектор вместо массива.