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都行(真的)。

posted on 2021-12-02 00:27  华容道专家  阅读(47)  评论(0)    收藏  举报