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

[C++] vptr, where are you?的更多相关文章

  1. 关于vptr指针初始化的分步

    vptr:一个具有虚函数类的对象所具有的隐藏的成员,指向该类的虚函数表. 父类对象的vptr指向是一直指向父类的.但子类的vptr指针最终是指向子类的, 当子类创建的时候,先调用父类构造函数,这个时候 ...

  2. C++vptr初始化时间

    给出如下代码段: #include <iostream> #include "stdio.h" using namespace std; class A { publi ...

  3. 深入剖析C++多态、VPTR指针、虚函数表

    在讲多态之前,我们先来说说关于多态的一个基石------类型兼容性原则. 一.背景知识 1.类型兼容性原则 类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代.通过公有继承,派 ...

  4. 这里面盲点很多,构造函数的调用问题,还有vptr指针的++问题(已解决)

    #include<iostream> //实现vptr指针初始化问题 using namespace std; class Father { public: Father (int f) ...

  5. c++多态之——vptr指针

    之前做过一个测试,在一个类中定义一个virtual修饰的函数时,sizeof这个类,发现类的大小多了恰好一个指针的字节大小,当初不明白,只是记住有这么一个特性.后来,发现它就是c++编译器给我们添加的 ...

  6. 虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?

    五条基本规则: 1.如果基类已经插入了vptr, 则派生类将继承和重用该vptr.vptr(一般在对象内存模型的顶部)必须随着对象类型的变化而不断地改变它的指向,以保证其值和当前对象的实际类型是一致的 ...

  7. vptr, vtable, virtual base class table

    #include <iostream> using namespace std; class X { int x, y, z; }; class Y: public virtual X { ...

  8. vptr

    #include <stdio.h> class Point3d { public: virtual ~Point3d(){} public: static Point3d origin; ...

  9. 派生类地址比基类地址少4(CDerived对象的起始地址存放的是虚表指针vptr,也就是子类的第一项内容。接下来的是基类的成员变量,接下来再是自身的成员变量)

    大家对虚表并不陌生,都知道每个含有虚函数的类对象都有1个虚指针,但是在现实使用中,却总是因为这而调试半天,才发现原来是虚指针惹的祸.我这几天在调试代码时候也中招了,我的问题是这样的,如下图,CTree ...

  10. 一个类的实例化对象所占空间的大小(对象大小= vptr(可能不止一个) + 所有非静态数据成员大小 + Aligin字节大小(依赖于不同的编译器))

    注意不要说类的大小,是类的对象的大小. 首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的. 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小. 如果 Class ...

随机推荐

  1. hdu 2159 FATE(DP)

    题意: 小余玩游戏,离最后一级还需n的经验值,但是他已经很厌烦了,还剩下m的忍耐度.每杀一只怪小余会得到相应的经验,同时减掉相应的忍耐度. 当忍耐度降到0或者0以下时,小余就不会再玩这个游戏.小余还说 ...

  2. "迷途"的野指针,都快找不着北了

    指针,C语言开发者表示很淦,指针的使用,很多人表示不敢直面ta,不像Java一样,有垃圾自动回收功能,我们不用担心那么多内存泄漏等问题,那C语言里边呢,指针又分为了"野指针",&q ...

  3. 问题 N: 非洲小孩

    题目描述 家住非洲的小孩,都很黑.为什么呢? 第一,他们地处热带,太阳辐射严重. 第二,他们不经常洗澡.(常年缺水,怎么洗澡.) 现在,在一个非洲部落里,他们只有一个地方洗澡,并且,洗澡时间很短,瞬间 ...

  4. 持续集成、持续交付(CI/CD)开篇,先来唠唠嗑

    前言 现在稍微有点规模的系统,很多都是采用分布式/微服务架构,将一个大系统拆分为很多个功能模块进行开发.测试.发布.管理等,如果全部流程都采用人工的形式进行的话,效率肯定是超级不高效滴.而且现在很多项 ...

  5. 不可忽视的Dubbo线程池

    问题描述 线上突然出现Dubbo超时调用,时间刚好为Consumer端设置的超时时间. 有好几个不同的接口都报超时了 第1次调用超时,第2次(或第3次)重试调用非常快(正常水平) Dubbo调用超时的 ...

  6. <C#任务导引教程>练习十

    /*83,使用接口完成多继承问题 简化版*/using System;interface ITeacher{    string Name    {        get;        set;   ...

  7. Spring Cloud Gateway自定义过滤器实战(观测断路器状态变化)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. [luogu5344]逛森林

    由于没有删边操作,可以先建出整棵森林,之后再用并查集判断是否连通,若连通必然与最后的森林相同 但如果用树链剖分+线段树的形式来优化建图,更具体如下: 建立两颗线段树,左边从儿子连向父亲,右边从父亲连向 ...

  9. 【论文阅读】Beyond OCR + VQA: 将OCR融入TextVQA的执行流程中形成更鲁棒更准确的模型

    论文题目:Beyond OCR + VQA: Involving OCR into the Flow for Robust and Accurate TextVQA 论文链接:https://dl.a ...

  10. ABC201题解

    因为学校的某些操作. 让最近两天的\(Atcoder\)都能打了,挺开心的. 想上次\(ABC\)看错题意,失败退场. ------------------------------ \(A\) 直接手 ...