- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题更多是关于语言设计,而不是关于更改 C++ 约定。
在考虑 Go 编程语言(它如何清理将数据与接口(interface)分离,有效地将所有对象转换为结构)和 C++ 中的 POD(我喜欢 memset/memcpy 在分配大量类似结构的小对象时),我想知道将 vptr 直接附加到对象实例的 C++ 编译器约定,弄乱了布局。
这是一项要求还是只是一项约定?
如果您正在设计一个替代编译器,您是否可以为 vptrs 使用一个大的外部查找表?例如, map<void*,vptr>
这样的结构
?所有实例都是 POD,关于内存设置,要查找其 vptr,我们将获取其地址并查看大型外部查找表。
缺点是,所有内容都需要查找。这是可行的替代设计还是存在严重缺陷?
最佳答案
性能很可能会受到影响。一些语言为方法查找添加某种缓存。
您可以使用不同的方法来查找调用给定选择器(或方法名称)的方法。看Smalltalk或 Self或 Javascript或 Common Lisp Object system或 Ocaml
但是,某些语言的实现包含巧妙的技巧(缓存、JIT 等),使它们与 C++ 一样快(但这是一个实现问题,而不是语言设计问题)。
关于c++ - C++ 编译器中的 POD 和 VPtr 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8381780/
我正在阅读 Inside C++ Object Model 一书中与对象破坏相关的主题并遇到了这个问题。 它表示在执行用户自定义析构函数之前,析构函数将被扩充。扩充的第一步是将 vptr 指针重置为该
在许多资料中,书籍等都写着“不要在子类构造函数中调用 this->virtualFunction”,并且在一些资料中解释了为什么你不能这样做。因为目前根本没有创建构造类。因此,将从子构造函数调用的虚函
我有一个带有虚拟析构函数的类“base”,因此其中有一个 VTable 和相应的 VTPR,以及一个从它派生的类: class base { public: virtual ~base() {
为什么我们不对非虚函数使用相同的方法? 我的意思是,为什么我们要那样使用虚函数?我们不能将它们用作非虚拟的并覆盖它们吗? 如果这种方法可以节省我们的时间/空间或其他任何东西,为什么我们不对非虚函数使用
vptr 索引应该显示所有虚函数,但在我的例子中,3 个虚函数中只显示了 2 个。 我在下面提供完整的代码和屏幕截图:- 类头.h #include using namespace std; //
class base { public: void virtual fn(int i) { cout fn(i); cout fn(i) 调用;没事。 我的观点是,如果
我在看 this article ,它说“进入基类析构函数后,该对象成为基类对象,并且 C++ 的所有部分——虚函数、dynamic_casts 等——都以这种方式对待它。”这是否意味着 vptr 在
这与之前的许多问题类似,但它提出了一些我无法找到答案的问题。 #include using namespace std; class Base1 { public: int
最近,我一直在阅读“inside the c++ object model”。它说 vptr 在调用基类的构造函数后初始化。所以我进行了测试: class A { public: A(int
以上是一道面试题。 据我了解,作为虚拟分派(dispatch)机制的一部分,编译器会为每个类创建一个vTable,并在编译期间插入一个额外的指针(vptr)。但是它究竟是什么时候将类的虚拟表分配给这个
在c++中,我们在每个对象中都有VPTR,但每个类只有一个VTABLE。为什么 VPTR 在每个对象中?是不是重复了? 最佳答案 如果没有运行时类型信息,您将不知道对象属于哪个类。因此,为了调用方法,
有些东西我还是不明白。 对于我声明的每个类,都有一个指向类虚拟表的隐藏 vptr 成员。 假设我有这个声明: class BASE { virtual_table* vptr; //that'
根据 MSDN,__RTDynamicCast() function用于在 Visual C++ 中实现 dynamic_cast。它的参数之一是 LONG VfDelta,它被描述为“对象中虚函数指
任何具有虚函数的类都会获得一个额外的隐藏指针,该指针将指向最派生的类。 这个vptr的类型是什么? 最佳答案 它没有类型。这是标准未指定的实现细节; 它不是语言的一部分。 请注意,C++ 根本没有说必
我想知道是否存在编译器不需要将 vptr 分配给实例化对象的可能优化,即使该对象的类型是具有虚方法的类。 例如考虑: #include struct FooBase { virtual void
我正在上计算机安全课并且正在阅读 http://phrack.org/issues/56/8.html .在 bo3.cpp 中,作者创建了他自己的 VTABLE,并覆盖 VPTR 以指向他的 VTA
我有几个类(class),我试图了解 vptr 和 vtable 在这种情况下是如何工作的。 class RGB { short value[3]; }; class AbstractImage{
我想知道为什么在此处的一种情况下我在 delete 部分得到异常,而在另一种情况下却没有。 没有异常(exception)情况 #include using namespace std; class
对于一些编译器,如果一个类有虚函数,那么它的 vptr 可以用它的对象的第一个字节的地址来访问。例如, class Base{ public: virtual void f(){cout<<"
这个问题不是关于 C++ 语言本身(即不是关于标准),而是关于如何调用编译器来实现虚函数的替代方案。 实现虚函数的一般方案是使用指向指针表的指针。 class Base { private:
我是一名优秀的程序员,十分优秀!