对象的内部表示
Internal representation of objects
所以我一直认为当你做像ObjectA这样的东西时。field1, ObjectA就像堆栈上的任何值,你基本上访问它的字段。现在我正在浏览一门关于OOP语言的课程的笔记,并且意识到当你做ObjectA时。实际发生的是HEAP(ObjectA的地址)(field1),它返回field1的值。这让我有点困惑。有谁能告诉我为什么我们已经知道了对象的值还在查找吗?希望我能解释清楚…
对象并没有那么神奇。从本质上讲,对象只是由其所有成员的线性集合组成,成员周围的填充量未指定。在布局方面,c++类本质上类似于C结构体:
struct Foo {
int a;
char b;
std::string s;
static long q;
void bar() { print(s); log(a); }
static void car() { }
}
暂时忽略成员函数和静态函数,可以这样布局:
+= class Foo =+
+-------------+ --- <--- Foo * p
| int | s
+-------------+ i
| char | z
+-------------+ e
| <padding> | o
+-------------+ f
| std::string | (F
+-------------+ o
| <padding> | o)
+-------------+ ---/
类Foo
的每个对象都这样存储在内存中。惟一需要的额外数据是静态成员、成员函数和静态成员函数。
静态成员只是全局变量。所以我们只有一个全局变量:
+== static__Foo__q ==+
+--------------------+
| long int |
+--------------------+
接下来,静态成员函数就是普通的自由函数:
void static__Foo__car() { }
最后,成员函数:这些本质上也是普通的函数,尽管有一个额外的参数允许它们查找实例成员:
void member__Foo__bar(Foo * p) { print(p->s); log(p->a); }
唯一重要的区别是,不能获得普通的指向成员函数的自由函数指针,因为没有公开实现函数的实际名称。引用Foo::bar()
的唯一方法是通过指向成员函数void (Foo::*ptfm)() = &Foo::bar
的指针。成员对象更简单一些:你可以获得一个普通的指针,比如Foo x; int * p = &x.a;
,但是你也可以形成一个指向成员的指针:int Foo::*ptm = &Foo::a;
。
Foo x, y, z;
,则可以使用实例指针Foo * pi = &x;
和成员指针int &Foo::* ptm = &Foo::a
或void (Foo::*ptfm)() = &Foo::bar
的对访问给定实例的相关成员:整数pi->*ptm
和函数调用(pi->*ptfm)()
。(是的,->*
是一个操作符。)
(不能存在自由版本的函数指针,因为多态(虚)函数需要比简单的固定函数指针更复杂的分派机制)
要获得某些ClassA
的ObjectA
的field1
,计算机必须有包含ObjectA
的内存区域的地址,它(静态地)知道field1
(ClassA
)的偏移量(以字节为单位),因此它可以通过将该偏移量添加到ObjectA
的地址来检索field1
。
- 表示"accepting anything for this template argument" C++概念的通配符
- 将函数类成员映射到类本身内部
- 如何将ampl中的集合表示为c++中的向量
- std::is_base_of表示ctor编译错误
- 输入中的字符串数未知(以字母表示)
- Boost Spirit,获取迭代器内部语义动作
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 内联函数中具有内部链接的全局变量
- 在函数内部的声明中初始化数组,并在外部使用它
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 我可以信任表示整数的浮点或双精度来保持精度吗
- "Moving out"对象的内部表示形式。好不好?
- 非连续内部数字表示上的位移位
- 什么..表示函数内部参数(const char*值,..)
- C++编译器是否可以在内部用 0 或 1 以外的内容表示布尔值
- C++双精度/浮点数的内部表示
- 对象的内部表示
- c++ 11内部std::string表示(libstdc++)
- 如何使用c++ 11语言环境工具来使用UTF-8作为字符串的内部表示
- c++内部可以表示的0到1之间不舍入的最大和最小的数是什么?