Search(c++在线运行). 有的网站很慢——不是下面的程序有问题。
#include <string.h> #include <stdio.h> #include <new> typedef unsigned char byte; struct C1 { char m_str[5]; C1(const char* s = "CCC") { strcpy(m_str, s); } virtual void print() { puts(m_str); } }; struct C2 : public C1 { virtual void print() { puts(m_str); } }; int g; int main() { enum { N = 60 }; byte buf[N]; memset(buf, '_', N); C1* pc1 = new(buf)C1(); new(buf + 20)C2(), new(buf + 40)C2(); pc1->print(); printf("sizeof(C1)=%ld sizeof(C1*)=%ld\n", sizeof(C1), sizeof(C1*)); for (byte* p = buf; p < buf + N; p++) { const byte b = *p; if (b == 'C' || b == '_') printf("%c ", b); else printf("%02x ", b); } puts(""); if (byte *p = (byte*)memmem(buf, N, "CCC", 3)) p[1] = p[2] = '+'; pc1->print(); printf("%p, %p %p %p %p\n", buf, &g, *(void**)buf, (void*)(&C1::print), (void*)(&C2::print)); { int i = 0x55aa; byte *p = (byte*)&i; printf("%x %x\n", *p, p[1]); } return 0;
// placement new, memory leak, alloca() }
CCC
sizeof(C1)=16 sizeof(C1*)=8
80 20 40 00 00 00 00 00 C C C 00 _ _ _ _ _ _ _ _ 68 20 40 00 00 00 00 00 C C C 00 00 _ _ _ _ _ _ _ 68 20 40 00 00 00 00 00 C C C 00 00 _ _ _ _ _ _ _
C++
0x7ffe8b82edd0, 0x404054 0x402080 0x4013ca 0x4013ea
aa 55
- or -
CCC
sizeof(C1)=16 sizeof(C1*)=8
60 fd c6 03 dc 55 00 00 C C C 00 _ _ _ _ _ _ _ _ 48 fd c6 03 dc 55 00 00 C C C 00 00 _ _ _ _ _ _ _ 48 fd c6 03 dc 55 00 00 C C C 00 00 _ _ _ _ _ _ _
C++
0x7ffc26271bf0, 0x55dc03c70014 0x55dc03c6fd60 0x55dc03a6ec30 0x55dc03a6ec50
aa 55
memory_layout := code data
data := bss (inited global data) global_data heap stack
0x4013ca和0x4013ea是code. 0x404054是data, 0x7ffe8b82edd0是stack.
#include <stdio.h> #include <malloc.h> typedef struct AClass { int m_i; } AClass; typedef void (*PFN)(AClass*, int); void fn(AClass* self, int i) { printf("%d\n", self->m_i + i); } PFN AClass_vtbl[1] = { fn }; // sizeof(void*) == sizeof(PFN) #define CLS(X) class X { virtual void fn() {} }; CLS(B) CLS(C) class BC : public B, C {}; int main() { char* p = (char*)malloc(sizeof(PFN) + sizeof(AClass)); *((PFN**)p) = AClass_vtbl; AClass* that = (AClass*)(p + sizeof(PFN)); that->m_i = 10; printf("%p %p %p\n", AClass_vtbl, p, *(PFN*)p); PFN* vtbl = *((PFN**)p); vtbl[0](that, 20); free(p); BC bc; printf("%p %\p\n", (B*)&bc, (C*)&bc); return 0; } 0x404040 0x2358e70 0x404040 30 0x7ffc3476ec50 0x7ffc3476ec58
下个版本的python有颗语法糖(谣言): mtd set(i) : my i = i # a method
现在不用self,用m, this, that都行(真的)。
浙公网安备 33010602011771号