[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 ...
随机推荐
- [源码解析] PyTorch 如何实现后向传播 (4)---- 具体算法
[源码解析] PyTorch 如何实现后向传播 (4)---- 具体算法 目录 [源码解析] PyTorch 如何实现后向传播 (4)---- 具体算法 0x00 摘要 0x01 工作线程主体 1.1 ...
- HTML+CSS基础(HTML篇)
引言 在日常开发Android中,很多时候会遇到和WebView打交道,对CSS HTML JS不是很清楚的话是完不成一些功能的,本篇开始学习HTML,文章的主要内容是总结了慕课网中,HTML+CSS ...
- 密码学基础:AES加密算法
[原创]密码学基础:AES加密算法-密码应用-看雪论坛-安全社区|安全招聘|bbs.pediy.com 目录 基础部分概述: 第一节:AES算法简介 第二节:AES算法相关数学知识 素域简介 扩展域简 ...
- Get_init_color_map
#!/bin/bash./simulate_screencap.sh./analysis_screencap.py
- Windows7下面手把手教你安装Django - Hongten
我所使用的操作系统是Windows7,内存是2G 在搜索了一些资料发现,对于Django的安装,详细的真的很少,都说的很简化,然而,这篇blog可以手把手教你成功安装Django 对于Django的详 ...
- POJ 2584 T-Shirt Gumbo(二分图最大匹配)
题意: 有五种衣服尺码:S,M,L,X,T N个人,每个人都有一个可以穿的衣服尺码的范围,例:SX,意思是可以穿S,M,L,X的衣服. 给出五种尺码的衣服各有多少件. 如果可以满足所有人的要求,输出 ...
- hdu 1847 Good Luck in CET-4 Everybody! (简单博弈)
题意: n张牌,双方轮流抓取.每人每次抓取的牌数必须是2的幂次(1,2,4,8...). 最后抓完的人胜. 思路 : 考虑剩3张牌,后手胜. 考虑3的倍数.假设先抓者当轮抓2x 张,2x %3等于1或 ...
- yum Multilib version problems
这两天在更新CentOS7系统时,出现了Multilib version problems错误,执行命令: # yum update 出现了的错误信息: .... ---> Package li ...
- JMeter学习笔记--性能测试理论
一.性能测试技能树 二.性能测试流程 三.性能测试相关术语 性能测试指标就是: 多(并发量)快(响应时间)好(稳定性[长时间运行])省(资源使用率).思考时间 1.负载 模拟业务操作对服务器造成压力的 ...
- PTA 7-7 六度空间 (30分)
PTA 7-7 六度空间 (30分) "六度空间"理论又称作"六度分隔(Six Degrees of Separation)"理论.这个理论可以通俗地阐述为:& ...