Struct packing and alignment help organize data in memory efficiently. It ensures data fits well and works fast on the computer.
Struct packing and alignment in Embedded C
struct MyStruct {
char a;
int b;
char c;
} __attribute__((packed));The __attribute__((packed)) tells the compiler not to add extra spaces between fields.
Without packing, the compiler may add padding to align data for faster access.
struct Normal {
char a;
int b;
char c;
};struct Packed {
char a;
int b;
char c;
} __attribute__((packed));b to be aligned on an 8-byte boundary.struct Aligned {
char a;
int b __attribute__((aligned(8)));
char c;
};This program shows the difference in size and field positions between a normal struct and a packed struct. It prints the total size and the byte offset of each field.
#include <stdio.h> #include <stddef.h> struct Normal { char a; int b; char c; }; struct Packed { char a; int b; char c; } __attribute__((packed)); int main() { printf("Size of Normal struct: %zu\n", sizeof(struct Normal)); printf("Size of Packed struct: %zu\n", sizeof(struct Packed)); printf("Offset of a in Normal: %zu\n", offsetof(struct Normal, a)); printf("Offset of b in Normal: %zu\n", offsetof(struct Normal, b)); printf("Offset of c in Normal: %zu\n", offsetof(struct Normal, c)); printf("Offset of a in Packed: %zu\n", offsetof(struct Packed, a)); printf("Offset of b in Packed: %zu\n", offsetof(struct Packed, b)); printf("Offset of c in Packed: %zu\n", offsetof(struct Packed, c)); return 0; }
Packing structs can save memory but may slow down access on some processors.
Alignment helps the CPU read data faster by placing it on certain memory boundaries.
Use packing carefully when working with hardware or network protocols that require exact data layouts.
Struct packing removes extra spaces between fields to save memory.
Alignment adds spaces so data is placed on boundaries for faster access.
Use packing and alignment to control how data is stored and accessed in memory.
Practice
struct packing do in embedded C?Solution
Step 1: Understand struct packing purpose
Struct packing removes padding bytes between fields to reduce memory usage.Step 2: Compare with alignment
Alignment adds padding for faster access, packing removes it to save space.Final Answer:
Removes extra spaces between fields to save memory -> Option AQuick Check:
Struct packing = removes padding [OK]
- Confusing packing with alignment
- Thinking packing changes data types
- Assuming packing initializes values
Solution
Step 1: Recall GCC packing syntax
GCC uses __attribute__((packed)) after struct keyword or at end of struct definition.Step 2: Identify correct placement
struct __attribute__((packed)) MyStruct { int a; char b; }; places __attribute__((packed)) correctly after struct keyword.Final Answer:
struct __attribute__((packed)) MyStruct { int a; char b; }; -> Option DQuick Check:
GCC packing syntax = __attribute__((packed)) [OK]
- Using __packed keyword which is not standard GCC
- Placing __attribute__((aligned)) instead of packed
- Putting attributes in wrong position
struct Example {
char a;
int b;
};
sizeof(struct Example);What is the likely output on a 32-bit system where int is 4 bytes and alignment is on 4-byte boundaries?
Solution
Step 1: Analyze struct member sizes and alignment
char a = 1 byte, int b = 4 bytes aligned on 4-byte boundary.Step 2: Calculate padding and total size
After char a, 3 bytes padding added to align int b. Total size = 1 + 3 + 4 = 8 bytes. Struct size must be multiple of largest alignment (4), which 8 satisfies.Final Answer:
8 -> Option BQuick Check:
Size with padding = 8 bytes [OK]
- Ignoring padding bytes
- Adding padding after last member unnecessarily
- Assuming size is sum of member sizes only
struct Data {
char c;
int i;
} __attribute__((packed));
struct Data d;
printf("%zu", sizeof(d));The output is 5, but the program crashes when accessing
d.i. What is the likely cause?Solution
Step 1: Understand packing effect on alignment
Packing removes padding, so int i may not be aligned on 4-byte boundary.Step 2: Recognize hardware alignment requirements
Some systems crash or fault when accessing unaligned int variables.Final Answer:
Accessing unaligned int causes crash on some systems -> Option AQuick Check:
Unaligned access = crash risk [OK]
- Blaming printf format specifier
- Assuming packing always safe
- Ignoring hardware alignment rules
char a; short b; int c;
On a 32-bit system, how can you arrange and pack this struct to minimize memory size without causing unaligned access faults?
Solution
Step 1: Understand alignment requirements
int requires 4-byte alignment, short 2-byte, char 1-byte.Step 2: Arrange members largest to smallest
Ordering int c; short b; char a; places largest first, minimizing padding.Step 3: Use packing carefully
Packing removes padding but can cause unaligned access; here, ordering avoids unaligned access.Final Answer:
Order members as int c; short b; char a; and use packing -> Option CQuick Check:
Largest to smallest + packing = minimal size safe [OK]
- Ordering members smallest to largest causing padding
- Packing without considering alignment faults
- Ignoring hardware alignment rules
Ready to prove it?
Pass the test and this pattern moves unknown
