- 论坛徽章:
- 2
|
回复 #1 disheng727 的帖子
为什么总是有人对这个感兴趣 ……
#include <assert.h>
#include <string.h>
class A {
public:
int a;
char x;
};
class B : public A {
public:
char y;
};
class C : public B {
public:
char z;
};
typedef struct A_layout {
int a;
char x;
static void test() {
A a = A();
a.a = 1212;
a.x = 'a';
A_layout layout = A_layout();
memcpy(&layout,&a,sizeof(layout));
assert(a.a==layout.a);
assert(a.x==layout.x);
}
private:
static const char assume[];
} A_layout;
const char A_layout::assume[sizeof(A_layout)==sizeof(A)?1:-1] = {0};
typedef struct B_layout {
union
{
A_layout inheritedA;
struct
{
int a;
char x;
};
};
char y;
static void test() {
B b = B();
B_layout layout = B_layout();
test_layout(b,layout);
b.a = 1212;
b.x = 'a';
b.y = 'b';
test_layout(b,layout);
}
private:
static void test_union(const B_layout& layout) {
assert(&layout.a==&layout.inheritedA.a);
assert(layout.a==layout.inheritedA.a);
assert(&layout.x==&layout.inheritedA.x);
assert(layout.x==layout.inheritedA.x);
}
static void test_layout(const B& b,B_layout& layout) {
test_union(layout);
memcpy(&layout,&b,sizeof(layout));
test_union(layout);
assert(b.a==layout.a);
assert(b.x==layout.x);
assert(b.y==layout.y);
}
static const char assume[];
} B_layout;
const char B_layout::assume[sizeof(B_layout)==sizeof(B)?1:-1] = {0};
typedef struct C_layout {
union
{
B_layout inheritedB;
struct
{
union
{
A_layout inheritedA;
struct
{
int a;
char x;
};
};
char y;
};
};
char z;
static void test() {
C c = C();
C_layout layout = C_layout();
test_layout(c,layout);
c.a = 1212;
c.x = 'a';
c.y = 'b';
c.z = 'c';
test_layout(c,layout);
}
private:
static void test_layout(const C& c,C_layout& layout) {
test_union(layout);
memcpy(&layout,&c,sizeof(layout));
test_union(layout);
assert(c.a==layout.a);
assert(c.x==layout.x);
assert(c.y==layout.y);
assert(c.z==layout.z);
}
static void test_union(const C_layout& layout) {
assert(&layout.y==&layout.inheritedB.y);
assert(layout.y==layout.inheritedB.y);
assert(&layout.x==&layout.inheritedB.x);
assert(layout.x==layout.inheritedB.x);
assert(&layout.x==&layout.inheritedA.x);
assert(layout.x==layout.inheritedA.x);
assert(&layout.a==&layout.inheritedB.a);
assert(layout.a==layout.inheritedB.a);
assert(&layout.a==&layout.inheritedA.a);
assert(layout.a==layout.inheritedA.a);
}
static const char assume[];
} C_layout;
const char C_layout::assume[sizeof(C_layout)==sizeof(C)?1:-1] = {0};
int main() {
A_layout::test();
B_layout::test();
C_layout::test();
#if defined(_MSC_VER) && _MSC_VER<1400
// msvc6 don't support omit return in main.
return 0;
#endif
}
|
很无聊 …… |
|