二进制层次指的是什么?接口类的二进制布局结构指的是什么?

lnuyasha_hrb 2010-04-21 11:39:11
RT
二进制层次指的是什么?接口类的二进制布局结构指的是什么?
谁能具体解释一下,谢谢
...全文
207 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
eduyu 2010-04-30
  • 打赏
  • 举报
回复
c++没有规定二进制的格式,导致了不同编译器编译出来的代码,既obj文件,不能link。com的目的之一就是弥补这一点,通过规定二进制格式,使得不同编译器,甚至不能语言的程序能以oop的方式来交互。
lixung 2010-04-27
  • 打赏
  • 举报
回复
二进制层次就是编译后的存在形式
比如一个dll导出了funA,funB,那么其在c和c++编译器下导出名字是不一样的(但是funA,funB在.c和.cpp文件源码是一样的),就可以说c和cpp在二进制层次上是不兼容的

接口类的二进制布局结构指的是什么?
接口类在cpp就是抽象类吧,其布局说白了就是一个指针

ps:我猜lz在看com本质论
wshcdr 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 lnuyasha_hrb 的回复:]
RT
二进制层次指的是什么?接口类的二进制布局结构指的是什么?
谁能具体解释一下,谢谢
[/Quote]

简单来说,就是程序运行的时候,接口在内存中的布局结构
尹成 2010-04-25
  • 打赏
  • 举报
回复
在本系列的教程中,我要讨论一些ATL的内部工作方式以及它所使用的技术。
   在讨论的开始,让我们先看看一个程序的内存分布。首先,编写一个简单的程序,它没有任何的数据成员,你可以看看它的内存结构。
程序1.

#include <iostream>
using namespace std;

class Class {
};

int main() {
Class objClass;
cout << "Size of object is = " << sizeof(objClass) << endl;
cout << "Address of object is = " << &objClass << endl;
return 0;
}
这个程序的输出为:Size of object is = 1
Address of object is = 0012FF7C
现在,如果我们向类中添加一些数据成员,那么这个类的大小就会是各个成员的大小之和。对于模板,也依然是这样:
程序2.#include <iostream>
using namespace std;

template <typename T>
class CPoint {
public:
T m_x;
T m_y;
};

int main() {
CPoint<int> objPoint;
cout << "Size of object is = " << sizeof(objPoint) << endl;
cout << "Address of object is = " << &objPoint << endl;
return 0;
}
现在程序的输出为:Size of object is = 8
Address of object is = 0012FF78
那么,再向程序中添加继承。现在我们使Point3D类继承自Point类,然后来看看程序的内存结构:

程序3. #include <iostream>
using namespace std;

template <typename T>
class CPoint {
public:
T m_x;
T m_y;
};

template <typename T>
class CPoint3D : public CPoint<T> {
public:
T m_z;
};

int main() {
CPoint<int> objPoint;
cout << "Size of object Point is = " << sizeof(objPoint) << endl;
cout << "Address of object Point is = " << &objPoint << endl;

CPoint3D<int> objPoint3D;
cout << "Size of object Point3D is = " << sizeof(objPoint3D) << endl;
cout << "Address of object Point3D is = " << &objPoint3D << endl;

return 0;
}
程序的输出为: Size of object Point is = 8
Address of object Point is = 0012FF78
Size of object Point3D is = 12
Address of object Point3D is = 0012FF6C
这一程序演示了派生类的内存结构,它表明派生类的对象所占据的内存为它本身的数据成员和它基类的成员之和。
当虚函数加入到这个派对中的时候,一切就变得都有意思了。请看下面的程序:

程序4. #include <iostream>
using namespace std;

class Class {
public:
virtual void fun() { cout << "Class::fun" << endl; }
};

int main() {
Class objClass;
cout << "Size of Class = " << sizeof(objClass) << endl;
cout << "Address of Class = " << &objClass << endl;
return 0;
}
程序的输出为:Size of Class = 4
Address of Class = 0012FF7C
并且,在我们添加了多于一个的虚函数之后,会变得更加有趣:

程序5. #include <iostream>
using namespace std;

class Class {
public:
virtual void fun1() { cout << "Class::fun1" << endl; }
virtual void fun2() { cout << "Class::fun2" << endl; }
virtual void fun3() { cout << "Class::fun3" << endl; }
};

int main() {
Class objClass;
cout << "Size of Class = " << sizeof(objClass) << endl;
cout << "Address of Class = " << &objClass << endl;
return 0;
}
这个程序的输出和前一个程序一模一样,让我们再做一个实验来更好地弄懂这件事吧。

程序6. #include <iostream>
using namespace std;

class CPoint {
public:
int m_ix;
int m_iy;
virtual ~CPoint() { } // 译注:原文此处有分号,我将其去掉,下皆同
};

int main() {
CPoint objPoint;
cout << "Size of Class = " << sizeof(objPoint) << endl;
cout << "Address of Class = " << &objPoint << endl;
return 0;
}
程序的输出为:Size of Class = 12
Address of Class = 0012FF68
这些程序的输出表明,当你向类中添加了虚函数之后,那么它的尺寸就会增加一个int的大小。在Visual C++中也就是增加4个字节。这就意味着这个类中有三个整数大小的位置,一个是x,一个是y,另一个是处理虚函数之用的虚函数表指针。首先,让我们来看看这个新的位置,也就是这个位于对象首部(或末尾)的虚函数表指针。要这么做的话,我们需要直接存取对象所占用的内存。我们可以使用神奇的指针技术,即用一个指向int的指针来存储一个对象的地址。

gw_net 2010-04-24
  • 打赏
  • 举报
回复
就是struct的内存排列,像LONG这样的类型,很多语言都是4个字节
所以2进制排列都是一样的
sgzwiz 2010-04-22
  • 打赏
  • 举报
回复
就是指在内存中的分布结构
接口就是虚函数表,详细内容可看
http://www.vckbase.com/document/listdoc.asp?mclsid=17&sclsid=1703&page=2
ATL布幔之下的秘密1-5
lnuyasha_hrb 2010-04-22
  • 打赏
  • 举报
回复
还是不明白什么是“二进制布局结构”
谁可以举个例子说明下

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧