#include <iostream>
struct S1
{
char a;
int b;
char d;
};
#pragma pack(1)
struct S2
{
char a;
int b;
char d;
};
int main()
{
std::cout<<sizeof(S1)<<std::endl;
std::cout<<sizeof(S2)<<std::endl;
}
output:
12
6
Когда стоить использовать выравнивание в 1 байт, только при небольших объемах памяти? Какие плюсы и минусы?
Пройдемся по плюсам и минусам.
В целом, выравнивание стоит использовать в следующих ситуациях:
P.S. Кстати, в коде есть проблема. После того, как применили упаковку, нужно её аккуратно вернуть назад. Да, в этом примере ничего не будет, но если pragma pack
попадет в header файл, может быть большая беда - одна и та же структура будет иметь разный размер в разных единицах компиляции, поля будут выровнены по разному.
#pragma pack(push, 1)
struct Foo
{
// ...
};
#pragma pack(pop)
P.S.S. Можно ещё на хабре почитать.
Когда использовать? Тогда, когда Вы точно знаете, что делаете и это абсолютно необходимо. Какие минусы? Неопределённое поведение. Вот Ваш модифицированный код:
#include <iostream>
using std::cout;
struct S1
{
char a;
int b;
char d;
};
#pragma pack(1)
struct S2
{
char a;
int b;
char d;
};
int main()
{
cout << sizeof(S1) << "\n";
cout << sizeof(S2) << "\n";
cout << alignof(int) << "\n";
S2 s2;
size_t address = reinterpret_cast<size_t>(&s2.b);
cout << "Var address: " << std::hex << address << "\n";
cout << "Properly aligned? " << std::boolalpha << (address % alignof(int) == 0);
}
Последняя строчка скорее всего выведет false
, что означает, что переменная типа int
расположена по адресу, который противоречит требования выравнивания для этого типа (стандарт [basic.align]). А раз это противоречит требованиям стандарта, значит Ваша программа некорректна.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Нужно удалять файлы, в том числе и файлы "Только чтение"Если в свойствах стоит галочка "Только чтение", то через remove() удалить не получается
Я нашел оболочку для curl и пытаюсь ее "собрать" Что я сделал: