#1 Patrik
Hlavně je dobré si uvědomit, že při zarovnání můžou být mezi jednotlivými prvky mezery (nevyužité bajty). A pak nemusí být dvě struktury se stejným obsahem binárně shodné (binárně podle požadovaného principu).
Pokud např. uvedenou strukturu trošku přeskládám, můžu dostat toto:
#include <inttypes.h>
#include <iostream>
struct foo
{
int a;
short int b;
uint32_t e;
uint8_t c;
uint8_t d;
uint32_t f;
};
void dump(void* data)
{
const uint8_t* d = (uint8_t*)data;
for (unsigned i = 0; i < sizeof(foo); ++i)
std::cout << (int)d[i] << ' ';
std::cout << '\n';
}
void test(int index)
{
{
foo f;
f.a = 10;
f.b = 20;
f.c = 30;
f.d = 40;
f.e = 50;
f.f = 60;
dump(&f);
}
{
{
uint8_t a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 };
for (int i = 0; i < index && i < sizeof(a) / sizeof(*a); ++i)
std::cout << (int)a[i] << ' ';
std::cout << '\n';
}
foo f;
f.a = 10;
f.b = 20;
f.c = 30;
f.d = 40;
f.e = 50;
f.f = 60;
dump(&f);
}
}
int main()
{
test(5);
}
Přestože jsou obě struktury f obsahově stejné, může být výsledek programu např. tento:
10 0 0 0 20 0 0 0 50 0 0 0 30 40 0 0 60 0 0 0
1 2 3 4 5
10 0 0 0 20 0 7 8 50 0 0 0 30 40 15 16 60 0 0 0
Je vidět, že první řádek se se třetím neshoduje, protože ve druhém případě mezery mezi prvky struktury obsahují smetí, které zůstalo na zásobníku po předchozích proměnných. Výsledek se navíc může lišit podle platformy, překladače, verze překladače, parametrů překladu...
Pro tento příklad jsem data ve struktuře lehce zpřeházel, abych docílil mezer, ale i bez zpřeházení vzhledem k výše zmiňované nejisté velikosti int je výsledek nejednoznačný.