[C++] vptr, where are you?
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?的更多相关文章
- 关于vptr指针初始化的分步
vptr:一个具有虚函数类的对象所具有的隐藏的成员,指向该类的虚函数表. 父类对象的vptr指向是一直指向父类的.但子类的vptr指针最终是指向子类的, 当子类创建的时候,先调用父类构造函数,这个时候 ...
- C++vptr初始化时间
给出如下代码段: #include <iostream> #include "stdio.h" using namespace std; class A { publi ...
- 深入剖析C++多态、VPTR指针、虚函数表
在讲多态之前,我们先来说说关于多态的一个基石------类型兼容性原则. 一.背景知识 1.类型兼容性原则 类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代.通过公有继承,派 ...
- 这里面盲点很多,构造函数的调用问题,还有vptr指针的++问题(已解决)
#include<iostream> //实现vptr指针初始化问题 using namespace std; class Father { public: Father (int f) ...
- c++多态之——vptr指针
之前做过一个测试,在一个类中定义一个virtual修饰的函数时,sizeof这个类,发现类的大小多了恰好一个指针的字节大小,当初不明白,只是记住有这么一个特性.后来,发现它就是c++编译器给我们添加的 ...
- 虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?
五条基本规则: 1.如果基类已经插入了vptr, 则派生类将继承和重用该vptr.vptr(一般在对象内存模型的顶部)必须随着对象类型的变化而不断地改变它的指向,以保证其值和当前对象的实际类型是一致的 ...
- vptr, vtable, virtual base class table
#include <iostream> using namespace std; class X { int x, y, z; }; class Y: public virtual X { ...
- vptr
#include <stdio.h> class Point3d { public: virtual ~Point3d(){} public: static Point3d origin; ...
- 派生类地址比基类地址少4(CDerived对象的起始地址存放的是虚表指针vptr,也就是子类的第一项内容。接下来的是基类的成员变量,接下来再是自身的成员变量)
大家对虚表并不陌生,都知道每个含有虚函数的类对象都有1个虚指针,但是在现实使用中,却总是因为这而调试半天,才发现原来是虚指针惹的祸.我这几天在调试代码时候也中招了,我的问题是这样的,如下图,CTree ...
- 一个类的实例化对象所占空间的大小(对象大小= vptr(可能不止一个) + 所有非静态数据成员大小 + Aligin字节大小(依赖于不同的编译器))
注意不要说类的大小,是类的对象的大小. 首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的. 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小. 如果 Class ...
随机推荐
- T-SQL——函数——时间操作函数
目录 0. 日期和时间类型 0.0 时间类型 1. 转换函数 1.1 CAST 1.2 CONVERT 2. 日期操作函数 2.0 GETDATE和GETUTCDATE 2.1 SYSDATETIME ...
- hdu 1503 Advanced Fruits(DP)
题意: 将两个英文单词进行合并.[最长公共子串只要保留一份] 输出合并后的英文单词. 思路: 求最长公共子串. 记录路径: mark[i][j]=-1:从mark[i-1][j]转移而来. mark[ ...
- hdu 5090 Game with Pearls (额,, 想法题吧 / 二分图最大匹配也可做)
题意: 给你N个数,a1,,,,an.代表第i个管子里有ai个珍珠. 规定只能往每根管里增加k的倍数个珍珠. 如果存在一套操作,操作完毕后可以得到1~N的一个排列,则Jerry赢,否则Tom赢. 问谁 ...
- Oracle 整库备份还原
http://www.mamicode.com/info-detail-2481866.html sql语句 system用户登陆 查看表空间和存放位置 select t1.name,t2.name ...
- 『学了就忘』Linux基础命令 — 26、帮助命令
目录 1.man命令 (1)man命令的快捷键 (2)man命令的帮助级别(了解即可) (3)man命令的使用 2.info命令 3.help命令 4.--help选项 1.man命令 man是最常见 ...
- kafka的安装
kafka是基于java环境的,所以需要先安装java环境 centos:yum install java-11-openjdk ubuntu:apt install default-jdk 默安装默 ...
- robot_framewok自动化测试--(3)测试项目与测试套件的概念
测试项目与测试套件的概念 如果你查看当前所创建的项目会发现,"test_project"是一个目录: "test_suit"则是一个 txt 文件: " ...
- docker添加sudo权限
sudo groupadd docker # 添加group sudo gpasswd -a think docker # 添加用户到组 sudo service docker restart n ...
- 表现层(jsp)、持久层(dao)、业务层(逻辑层、service)
转自:http://www.blogjava.net/jiabao/archive/2007/04/08/109189.html 为了实现web层(struts)和持久层(Hibernate)之间的松 ...
- 简单的SQl时间序列生成,每次时间间隔10分钟。
create table #timeseries(Times datetime not null) go declare @firstdate datetime , @lastdate datetim ...