gpt4 book ai didi

c++ - C++ 代码中的额外大括号

转载 作者:IT老高 更新时间:2023-10-28 21:34:43 26 4
gpt4 key购买 nike

有时您会遇到带有额外大括号的代码,这与范围无关,只是为了可读性和避免错误。

例如:

GetMutexLock( handle ) ; 
{
// brace brackets "scope" the lock,
// must close block / remember
// to release the handle.
// similar to C#'s lock construct
}
ReleaseMutexLock( handle ) ;

我见过的其他地方是:

glBegin( GL_TRIANGLES ) ;
{
glVertex3d( .. ) ;
glVertex3d( .. ) ;
glVertex3d( .. ) ;
} // must remember to glEnd!
glEnd() ;

如果互斥锁没有被释放,这会引入编译器错误(假设您同时记得 } 和 Release() 调用)。

  1. 这是一种不好的做法吗?为什么?
  2. 如果不是,它会改变代码的编译方式或使其变慢吗?

最佳答案

大括号本身很好,它们所做的只是限制范围,您不会减慢任何速度。它可以被视为更清洁。 (总是更喜欢干净的代码而不是快速的代码,如果它更干净,在你分析之前不要担心速度。)


但就资源而言,这是一种不好的做法,因为您已将自己置于泄漏资源的位置。如果 block 中的任何东西抛出或返回,那么你就死定了。

使用 Scope-bound Resource Management (SBRM,也称为 RAII),通过析构函数将资源限制在一个范围内:

class mutex_lock
{
public:
mutex_lock(HANDLE pHandle) :
mHandle(pHandle)
{
//acquire resource
GetMutexLock(mHandle);
}

~mutex_lock()
{
// release resource, bound to scope
ReleaseMutexLock(mHandle);
}

private:
// resource
HANDLE mHandle;

// noncopyable
mutex_lock(const mutex_lock&);
mutex_lock& operator=(const mutex_lock&);
};

所以你得到:

{
mutex_lock m(handle);
// brace brackets "scope" the lock,
// AUTOMATICALLY
}

这样做会所有资源,它更清洁、更安全。如果你可以说“我需要释放这个资源”,那你就做错了;它们应该被自动处理。

关于c++ - C++ 代码中的额外大括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3568503/

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