javascript - 为什么在 JavaScript 中访问 myInstance.property1.subproperty2.subproperty3 很方便,而在 C++ 中则免费?

标签 javascript c++ performance

我一直将其理解为 JavaScript 中的一种节省成本的操作,以避免重复引用对象上的嵌套属性。您不必一遍又一遍地编写 a.b.c.d,而是更喜欢 let x = a.b.c.d;,然后使用 x(我经常听到的通俗说法是“缓存引用。”)

最近与一位 friend 交谈时发现,这样的事情在 C++ 中是完全没有必要的,而且是愚蠢的。

这是真的吗?如果是这样,为什么?我猜这与 C++ 对象和 JavaScript 对象之间底层语言实现的差异有关,但到底有什么区别?

最佳答案

与 C++ 类相比,JavaScript 对象更接近于 C++ 的 std::map(或 std::unordered_map)。

C++ 的优点是具有单独的编译和运行步骤。编译器确实可以花很长时间来分析程序的大块并对其进行大量优化。当您编写 C++ 时,您实际上并不是在编写供 CPU 执行的程序。您正在描述程序的行为,编译器将使用该描述为您生成一个程序。您的浏览器的 JavaScript 运行时(可能是 JIT 编译器)根本没有时间进行相同级别的分析和优化。它必须足够快地编译和运行您的程序,以便用户不会感觉到任何延迟。这并不是说 JavaScript 运行时不会进行任何优化,但与需要 20 分钟编译程序的 C++ 编译器相比,它往往会更加增量和本地化。

C++ 类的所有属性在编译时都是已知的。当您在 C++ 中访问对象的属性时,编译器将在编译时解析该访问;可能是少量内存加载或单个函数调用指令。由于这一切都在编译时解决,因此属性查找嵌套的深度并不重要。运行时性能将是相同的。此外,编译器将为您进行此类内存,可能是通过在寄存器中保留重复访问的属性来实现。

JavaScript 则不然。 JavaScript 对象没有一组已定义的属性。它们可以在对象的整个生命周期中添加和删除。这意味着 JavaScript 运行时必须使用某种关联数据结构(可能是哈希表)来跟踪对象的属性。当您请求对象的属性时,运行时必须查看该数据结构以查找所需的值,并且它必须对每个嵌套级别进行查找。

关于javascript - 为什么在 JavaScript 中访问 myInstance.property1.subproperty2.subproperty3 很方便,而在 C++ 中则免费?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61261378/

相关文章:

javascript - 解析.com : user is not defined

javascript - 将 Skype 按钮添加到 HTML 面板

mysql数据库自动分区

python - 如果执行因 RTSP 摄像头问题而停止,如何终止 cv2.VideoCapture(rtsp_url) 调用?

javascript - 如果SPA(单页应用程序)中的其他页面加载中断,如何避免先前的ajax响应?

javascript - 使用 .withSuccessHandler 更改输入按钮的属性

c++ - 除了 std::string 之外,增强 c++ 函数以获取 stringstream

c++ - 我可以确定线程是否具有 QEventLoop 吗?

c++ - 初始化程序列表在 Visual Studio 2012 Update 2 CTP 4(3 月)中不起作用

Java - 自定义绘画声明性能