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. Kubernetes Deployment 源码分析(二)

    概述startDeploymentController 入口逻辑DeploymentController 对象DeploymentController 类型定义DeploymentController ...

  2. Python-爬取CVE漏洞库👻

    Python-爬取CVE漏洞库 最近吧准备复现一下近几年的漏洞,一个一个的去找太麻烦了.今天做到第几页后面过几天再来可能就不记得了.所以我想这搞个爬虫给他爬下来做个excel表格,那就清楚多了.奈何还 ...

  3. 庆祝dotnet6,fastgithub送给你

    前言 dotnet6正式发布了,fastgithub是使用dotnet开发的一款github加速器,作为开发者,无人不知github,作为github用户,fastgithub也许是你不可或缺的本机工 ...

  4. 10分钟简单学习net core集成jwt权限认证,快速接入项目落地使用

    什么是JWT JSON Web Token(JWT)是目前最流行的跨域身份验证.分布式登录.单点登录等解决方案. JWT的官网地址:https://jwt.io/ 通俗地来讲,JWT是能代表用户身份的 ...

  5. celery tasks always in pending

    Result backend doesn't work or tasks are always in PENDING state¶All tasks are PENDING by default, s ...

  6. layui表格-template模板的三种用法

    问题情境: layui中将数据库数据通过layui table渲染到前端表格,非常简单,但是如果数据库存储的信息不能被直接展示,项目中该页面有好几个这样的字段,会员类型,支付类型,会员时长还有平台类型 ...

  7. RabbitMQ保证消息的顺序性

    当我们的系统中引入了MQ之后,不得不考虑的一个问题是如何保证消息的顺序性,这是一个至关重要的事情,如果顺序错乱了,就会导致数据的不一致.       比如:业务场景是这样的:我们需要根据mysql的b ...

  8. Java学习(九)

    今天先学习了内联框架的知识,使用iframe的标签,还有超链接的知识. 做了个小实践 <!DOCTYPE html> <head> <meta charset=" ...

  9. Python布尔值

    在学到Python数据类型时,发现与大多数语言没什么区别 布尔值可以用 and or not 来运算 and运算是与运算,所有条件都符合才为true >>> True and Tru ...

  10. Github树型插件--Octotree

    octotree 是一款chrome插件,用于将 GitHub 项目代码以树形格式展示,而且在展示的列表中,我们可以下载指定的文件,而不需要下载整个项目. 官网地址:https://www.octot ...