社区
C++ 语言
帖子详情
如何控制纯虚类内存布局?
jjcang
2008-09-16 11:27:50
题目可能有些绕口,是这样的。
exe程序调用dll文件,接口是一个纯虚类,但是运行过程中发现调用虚函数时this指针传入有错误,
exe和dll是不同编译器编的,我想可能是这引起的,
由于我不清楚编译器如何布局纯虚类的vptable(c++也没要求如何布局),
我想有没有什么编译选项控制这种布局?
谢谢
...全文
123
12
打赏
收藏
如何控制纯虚类内存布局?
题目可能有些绕口,是这样的。 exe程序调用dll文件,接口是一个纯虚类,但是运行过程中发现调用虚函数时this指针传入有错误, exe和dll是不同编译器编的,我想可能是这引起的, 由于我不清楚编译器如何布局纯虚类的vptable(c++也没要求如何布局), 我想有没有什么编译选项控制这种布局? 谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
e_sharp
2008-09-16
打赏
举报
回复
[Quote=引用 4 楼 jjcang 的回复:]
而且我这个也不是扩展dll,用纯虚类做接口也是借助com的思想。
[/Quote]
那就直接用com好了
e_sharp
2008-09-16
打赏
举报
回复
[Quote=引用 3 楼 jjcang 的回复:]
引用 1 楼 taodm 的回复:
用纯C接口。珍惜生命,远离扩展dll
用虚类就是想方便啊。有快1百个函数呢,我是动态GetProcess调用dll的,用c接口一个个赋值岂不是要疯了,
[/Quote]
还是用纯C接口,函数多,可以用参数来区分
jjcang
2008-09-16
打赏
举报
回复
而且我这个也不是扩展dll,用纯虚类做接口也是借助com的思想。
jjcang
2008-09-16
打赏
举报
回复
[Quote=引用 1 楼 taodm 的回复:]
用纯C接口。珍惜生命,远离扩展dll
[/Quote]
用虚类就是想方便啊。有快1百个函数呢,我是动态GetProcess调用dll的,用c接口一个个赋值岂不是要疯了,
太乙
2008-09-16
打赏
举报
回复
类的虚表指针就是this所指向的地址!lz可以把这四个字节复制到另一块内存,然后传递那个内存的值!
taodm
2008-09-16
打赏
举报
回复
用纯C接口。珍惜生命,远离扩展dll
jjcang
2008-09-16
打赏
举报
回复
虚函数已经找到了,说明vptable指针是正确的,不明白调用时为什么gcc多了4个字节。
可能是附带一些rtti的信息?
jjcang
2008-09-16
打赏
举报
回复
调用方式都是stdcall的,
就是this在栈中的位置不一样,vc直接取栈顶作为this,gcc在加了4个字节。
oyster2008
2008-09-16
打赏
举报
回复
这个应该跟纯虚类在内存中的布局无关,因为编译器最后生成了附加的代码来操作虚函数,这些代码会正确的找到函数
我觉得你可以检查一下参数的传递方式,如__cdecl、__stdcall等,如果不一样,则有可能出现错误
jjcang
2008-09-16
打赏
举报
回复
算了。结贴。
编译器的不同,以后再深究吧。
iiarchitecture
2008-09-16
打赏
举报
回复
不懂,学习中。。。
jjcang
2008-09-16
打赏
举报
回复
还是没有解决问题啊。up
我还是用c接口了,但是c++这个问题还没有弄清楚
C++编程思想习题
目 录 译者序 前言 第1章 对象的演化 1.1基本概念 1.1.1对象:特性十行为 1.1.2继承:类型关系 1.1.3多态性 1.1.4操作概念:OOP程序像什么 1.2为什么C++会成功 1.2.1较好的C 1.2.2采用渐进的学习方式 1.2.3运行效率 1.2.4系统更容易表达和理解 1.2.5“库”使你事半功倍 1.2.6错误处理 1.2.7大程序设计 1.3方法学介绍 1.3.1复杂性 1.3.2内部原则 1.3.3外部原则 1.3.4对象设计的五个阶段 1.3.5方法承诺什么 1.3.6方法应当提供什么 1.4起草:最小的方法 1.4.1前提 1.4.2高概念 1.4.3论述(treatment) 1.4.4结构化 1.4.5开发 1.4.6重写 1.4.7逻辑 1.5其他方法 1.5.1Booch 1.5.2责任驱动的设计(RDD) 1.5.3对象建模技术(OMT) 1.6为向OOP转变而采取的策略 1.6.1逐步进入OOP 1.6.2管理障碍 1.7小结 第2章 数据抽象 2.1声明与定义 2.2一个袖珍C库 2.3放在一起:项目创建工具 2.4什么是非正常 2.5基本对象 2.6什么是对象 2.7抽象数据类型 2.8对象细节 2.9头文件形式 2.10嵌套结构 2.11小结 2.12练习 第3章 隐藏实现 3.1设置限制 3.2C++的存取
控制
3.3友元 3.3.1嵌套友元 3.3.2它是纯的吗 3.4对象
布局
3.5类 3.5.1用存取
控制
来修改stash 3.5.2用存取
控制
来修改stack 3.6句柄类(handleclasses) 3.6.1可见的实现部分 3.6.2减少重复编译 3.7小结 3.8练习 第4章 初始化与清除 4.1用构造函数确保初始化 4.2用析构函数确保清除 4.3清除定义块 4.3.1for循环 4.3.2空间分配 4.4含有构造函数和析构函数的stash 4.5含有构造函数和析构函数的stack 4.6集合初始化 4.7缺省构造函数 4.8小结 4.9练习 第5章 函数重载与缺省参数 5.1范围分解 5.1.1用返回值重载 5.1.2安全类型连接 5.2重载的例子 5.3缺省参数 5.4小结 5.5练习 第6章 输入输出流介绍 6.1为什么要用输入输出流 6.2解决输入输出流问题 6.2.1预先了解操作符重载 6.2.2插入符与提取符 6.2.3通常用法 6.2.4面向行的输入 6.3文件输入输出流 6.4输入输出流缓冲 6.5在输入输出流中查找 6.6strstreams 6.6.1为用户分配的存储 6.6.2自动存储分配 6.7输出流格式化 6.7.1内部格式化数据 6.7.2例子 6.8格式化操纵算子 6.9建立操纵算子 6.10输入输出流实例 6.10.1代码生成 6.10.2一个简单的数据记录 6.11小结 6.12练习 第7章 常量 7.1值替代 7.1.1头文件里的const 7.1.2const的安全性 7.1.3集合 7.1.4与C语言的区别 7.2指针 7.2.1指向const的指针 7.2.2const指针 7.2.3赋值和类型检查 7.3函数参数和返回值 7.3.1传递const值 7.3.2返回const值 7.3.3传递和返回地址 7.4类 7.4.1类里的const和enum 7.4.2编译期间类里的常量 7.4.3const对象和成员函数 7.4.4只读存储能力 7.5可变的(volatile) 7.6小结 7.7练习 第8章 内联函数 8.1预处理器的缺陷 8.2内联函数 8.2.1类内部的内联函数 8.2.2存取函数 8.3内联函数和编译器 8.3.1局限性 8.3.2赋值顺序 8.3.3在构造函数和析构函数里隐藏行为 8.4减少混乱 8.5预处理器的特点 8.6改进的错误检查 8.7小结 8.8练习 第9章 命名
控制
9.1来自C语言中的静态成员 9.1.1函数内部的静态变量 9.1.2
控制
连接 9.1.3其他的存储类型指定符 9.2名字空间 9.2.1产生一个名字空间 9.2.2使用名字空间 9.3C++中的静态成员 9.3.1定义静态数据成员的存储 9.3.2嵌套类和局部类 9.3.3静态成员函数 9.4静态初始化的依赖因素 9.5转换连接指定 9.6小结 9.7练习 第10章 引用和拷贝构造函数 10.1C++中的指针 10.2C+十中的引用 10.2.1函数中的引用 10.2.2参数传递准则 10.3拷贝构造函数 10.3.1传值方式传递和返回 10.3.2拷贝构造函数 10.3.3缺省拷贝构造函数 10.3.4拷贝构造函数方法的选择 10.4指向成员的指针(简称成员指针) 10.5小结 10.6练习 第11章 运算符重载 1
C++中编译器怎么处理类的
内存
分布
C++特别适合用于开发压榨机器性能的程序,在资源有限的情况下,C++程序员不能放过机器的每一点计算力以及每一字节
内存
。当然了,要做到这一点,编程语言本身要提供精准的
控制
能力,C++语言作为一种强类型的编程语言,“精准
控制
”自然不在话下。这样看来,将机器性能发挥到极限的责任最后还是落在程序员身上了,要做到这一点,我们至少需要对各种数据类型使用的
内存
情况了然于胸。 C++是面向对象程序设计语言,自然支持面向对象的三大特性(继承、封装、多态)。在实现中,类的常见组织形式大致有以下几种,空类、普通类、单一继承(.
MT5智能交易编程实战59课精讲
MetaQuotes Language 5 (MQL5)是一种高水平编程语言,专为开发技术指标、EA交易和实用应用程序而设计,进而使金融交易自动化。本课程为MT5/MQL5智能交易编程学习,从零基础开始讲解,全面掌握MQL5基础语法,熟练使用MQL5常用函数API,实战开发EA自动化交易程序,从入门到精通,进而能够进行自动交易策略开发,走上EA自动化交易之路。本课程学习过程分为三个阶段:第一阶段、MQL5语言基础学习:通过MQL5语法基础学习,能够快速掌握MetaEditor编辑器使用和基础编程语法,为后续学习MQL5函数API,进行实战学习打下良好基础。内容包括:MT5基本功能介绍、MetaEditor编辑器、基本数据类型、常量和变量、枚举类型、结构体、数组、算数运算符、关系运算符、逻辑运算符、条件判断、循环、函数、类的定义、类的成员变量和函数、类的构造函数、类的析构函数、类的函数重载、类的成员变量的访问权限、类的继承、类的多态、抽象类和纯虚函数。第二阶段:MQL5函数API详解:此阶段为进阶过程,在学习了解MT5交易平台的基础上,掌握如何通过程序获取交易数据、
控制
交易过程,模拟交易策略,实现自动化交易。内容包括:帮助手册讲解、智能EA指标脚本运行框架、获取账户、客户端、货币信息、获取交易品种信息、获取市场深度信息、获取财经日历信息、K线数据、时间序列、指标访问、获取订单信息、下单、挂单操作、图表窗口操作、图表上画对象、脚本开发实例、指标开发实例、智能EA开发实例、历史数据回测及参数优化、发送邮件、警报、消息提醒、信号订阅、跟单、文件操作、标准程序库。第三阶段:EA交易程序实战:通过前面两个阶段的学习,已经掌握了MT5量化交易编程的基础知识和能力,在实战阶段结合策略交易的关键环节,通过多个实战示例,讲解如何进行仓位管理、风险
控制
、止盈止损、指标定制等,实现复杂的交易策略逻辑,提高程序自动化交易的实战能力。内容包括:一个简单趋势EA、订单请求合法性校验、三重时间框架、仓位管理、移动止损、移动止盈、隐藏止盈止损价格、风险
控制
、时间
控制
、参数
控制
、展示面板、统计分析、持仓单一键平仓脚本、六类挂单一键取消脚本、按时间标记位置脚本、按价格标记位置脚本、双线一柱变色MACD指标。
C/C++编程:虚函数与纯虚函数
虚函数 VS 纯虚函数 虚函数 #include <iostream> using namespace std; class A { public: virtual void foo() { cout<<"A::foo() is called"<<endl; } }; class B:public A { public: void foo() // 可以不实现,如果不实现,调用a;如果实现了,调用自己的
C/C++、OS、网络面经
深信服面经Q1. 结构体大小Q2. 什么是
内存
对齐?为什么要
内存
对齐?Q3. C语言中的堆和栈 Q1. 结构体大小 Q2. 什么是
内存
对齐?为什么要
内存
对齐? 结构体的sizeof涉及到字节对齐问题 为什么需要字节对齐?计算机组成原理教导我们这样有助于加快计算机的取数速度,否则就得多花指令周期了。 字节对齐的细节和编译器的实现相关,但一般而言,满足三个准则: 1) 结构体变量的首地址能够被其最宽...
C++ 语言
64,647
社区成员
250,476
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章