gpt4 book ai didi

c++ - 关于RAII、STL pop、PIMPL的基本问题

转载 作者:可可西里 更新时间:2023-11-01 16:28:00 25 4
gpt4 key购买 nike

今天阅读 proggit 时,我在 post 中看到了这条评论关于 C++ 如何在 Google Ai 挑战赛中名列前茅。用户 reventlov 声明

The biggest problem I have with C++ is that it's waaay too easy to think that you're a "C++ programmer" without really understanding all the things you need to understand to use C++ acceptably well.

You've got to know RAII, and know to use namespaces, and understand proper exception handling (for example, you should be able to explain why the pop() methods in the STL do not return the values they remove). You've got to know which of the three generations of functions in the standard library is the right one. You should be familiar with concepts like PIMPL. You need to understand how the design of the standard library (especially the STL) works. You need to understand how macros interact with namespaces, and why you usually shouldn't use macros in C++, and what you should use instead (usually templates or inlines, rarely a class). You need to know about boost.

我认为我是他提到的那些无知的 C++ 程序员之一。为了保持简短,我的问题是

  1. 你能举一个典型的 RAII 疏忽错误的例子吗?最佳实践规定使用 RAII 但程序员使用其他方式实现?
  2. 为什么 STL 中的 pop() 方法不返回它们删除的值?
  3. 我阅读了 PIMPL 的维基百科条目,但一点都不明白。你能举例说明 PIMPL 习语的典型用法吗?

最佳答案

  1. RAII 至关重要但有时被遗忘的一个很好的例子是锁定互斥锁。如果您有一段代码锁定互斥量,执行操作,然后解锁它,如果操作抛出异常或以其他方式导致线程死亡,则互斥量保持锁定状态。这就是为什么有几个作用域锁类(如 QMutexLocker )的原因,因为如上所述 here ,您保证析构函数将运行。因此,如果您使用作用域锁,它总是会在销毁时解锁,从而防止死锁。

  2. 为了速度,Pop 返回void:SGI FAQ ,并防止对象复制构造函数可能抛出的异常。

  3. PIMPL Qt 框架大量使用它来提供二进制兼容性。它允许您对公共(public) API 隐藏数据结构的所有内部结构。这意味着,如果您想将私有(private)成员添加到类中,您可以将其添加到 d 指针中。这维护了 Binary Code Compatibility因为唯一公开的数据成员是一个指针。

关于c++ - 关于RAII、STL pop、PIMPL的基本问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2387914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com