Answer # 1 | [See http://www.geocities.com/vijoeyz/faq/c/padding.txt]
All modern CPUs expect that the fundamental types -- int's, float's and long's -- are stored in the memory at their natural boundary; typically, at addresses that are multiples of their length. Some CPU work efficiently if the memory is properly aligned, and some can work in either case.
For the following examples, let us assume:
sizeof (int) == 4 sizeof (char) == 1 sizeof (float) == 4
When a C compiler processes a structure, it adds padding bit(s)/byte(s), if required, between the members to ensure proper alignment. Consider the following scenario:
> What is the difference between the following structures: > > struct pad1 > { > int a; > char c; > float f; > }; >
"a" and "f" should occur at an address multiple of 4, whereas "c" can take any -- odd or even -- address. So, the structure appears in the memory as shown:
___________________ | a0 | a1 | a2 | a3 | 4-byte alignement ------------------- P is padding byte | c0 | P0 | P1 | P2 | ------------------- | f0 | f1 | f2 | f3 | -------------------
> and > > struct pad2 > { > float f; > int a; > char c; > }; > ___________________ | f0 | f1 | f2 | f3 | 4-byte alignement ------------------- P is padding byte | a0 | a1 | a2 | a3 | ------------------- | c0 | P0 | P1 | P2 | -------------------
Following point are worth noting:
* The compiler also ensures that the structure as a whole appears at an aligned address.
* Padding does NOT occur at the beginning of a structure.
* The value of padding bytes or bits are implementation defined.
> What is the use of padding?
* Padding is useful, for example, in conforming to externally imposed layouts of machine registers.
* The obvious advantage is efficient access by CPU.
> And finally what is ring buffer?Where is it used.Someone pls. explain > in detail.
* A buffer of data which is of fixed size; when it fills, further data is placed back at the start of the buffer, overwriting the old data, in a "ring". Commonly used in device drivers.
For more examples, use the Google the keyword "define: ring buffer", excluding the quotes. | | Vijoeyz
|
Answer # 2 | structure padding is used to pad the data in such a way that it can be sent to external devices. Sometimes, the data is padded in such a way that it can be used on little endian vs big endian processors Padding is done to fast access of data from memory.
Re: How to avoid structure padding in C? | Answer # 1 | by using #pragma you can avoid structure padding. and that to u can use it in linux or unix if i m not wrong. | | Ravi
| |
| Re: How to avoid structure padding in C? | Answer # 2 | yes u can use pragma to change change byte alignment. for e.g. typedef struct _s1{ unsigned int i; unsigned char c; unsigned long a; unsigned short e; } s1; Size of this structure is of 11 Bytes. but due to default byte alignment(8 byte) which is different for different compilers. The size of structure would be 16 Bytes. In order to change the alignment, we will have to do something like this.
#pragma pack(push,1) typedef struct _s1{ unsigned int i; unsigned char c; unsigned long a; unsigned short e; //unsigned char b; } s1; #pragma pack(pop)
This will change the byte alignment to 1 Byte. and thus size of structure will be exactly 11 bytes | | Lokesh Mogra
| | | | |
| Re: How to avoid structure padding in C? | Answer # 3 | Those are 3 different things.
Structure Padding
Most processors require specific memory alignment on variables certain types. Normally the minimum alignment is the size of the basic type in question, fo instance this is common
char variables can be byte aligned and appear at any byte boundary
short (2 byte) variables must be 2 byte aligned, they can appear at any even byte boundary. This means that 0x10004567 is not a valid location for a short variable but 0x10004566 is.
long (4 byte) variables must be 4 byte aligned, they can only appear at byte boundarys that are a multiple of 4 bytes. This means that 0x10004566 is not a valid location for a long variable but 0x10004568 is.
Structure padding occurs because the members of the structure must appear at the correect byte boundary, to achieve this the compiler puts in padding bytes (or bits if bit fields are in use) so that the structure members appear in the correct location. Additionally the size of the structure must be such that in an array of the structures all the structures are correctly aligned in memory so there may be padding bytes at the end of the structure too
struct example { char c1; short s1; char c2; long l1; char c3; }
In this structure, assuming the alignment scheme I have previously stated then
c1 can appear at any byte boundary, however s1 must appear at a 2 byte boundary so there is a padding byte between c1 and s1.
c2 can then appear in the available memory location, however l1 must be at a 4 byte boundary so there are 3 padding bytes between c2 and l1
c3 then appear in the available memory location, however because the structure contains a long member the structure must be 4 byte aligned and must be a multiple of 4 bytes in size. Therefore there are 3 padding bytes at the end of the structure. it would appear in memory in this order
c1 padding byte s1 byte 1 s1 byte 2 c2 padding byte padding byte padding byte l1 byte 1 l1 byte 2 l1 byte 3 l1 byte 4 c3 padding byte padding byte padding byte
The structure would be 16 bytes long.
re-written like this
struct example { long l1; short s1; char c1; char c2; char c3; }
Then l1 appears at the correct byte alignment, s1 will be correctly aligned so no need for padding between l1 and s1. c1, c2, c3 can appear at any location. The structure must be a multiple of 4 bytes in size since it contains a long so 3 padding bytes appear after c3
It appears in memory in the order
l1 byte 1 l1 byte 2 l1 byte 3 l1 byte 4 s1 byte 1 s1 byte 2 c1 c2 c3 padding byte padding byte padding byte
and is only 12 bytes long.
I should point out that structure packing is platform and compiler (and in some cases compiler switch) dependent.
Memory Pools are just a section of memory reserved for allocating temporarily to other parts of the application
A memory leak occurs when you allocate some memory from the heap(or a pool) and then delete all references to that memory without returning it to the pool it was allocated from. | | Santhi Perumal
| |
| Re: How to avoid structure padding in C? | Answer # 4 | by using #pragma pack |
|
No comments:
Post a Comment