C++ 互斥和内联函数

C++ 互斥和内联函数,c++,multithreading,scope,C++,Multithreading,Scope,我们和我的朋友讨论了函数和多线程。示例代码为: void SomeClass::Foo() { std::lock_guard<std::mutex> lock(mMutexObj); statement1; statement2; statement3; } 可能吗?编译器将内联此类函数的百分比是多少?或者我可能不太了解内联函数的作用域?如果函数是否内联,或者是否声明为内联,程序的可观察行为不会改变。在任何一种情况下,都会在适当的位置调用lock_gua

我们和我的朋友讨论了函数和多线程。示例代码为:

void SomeClass::Foo()
{
   std::lock_guard<std::mutex> lock(mMutexObj);

   statement1;
   statement2;
   statement3;
}

可能吗?编译器将内联此类函数的百分比是多少?或者我可能不太了解内联函数的作用域?

如果函数是否内联,或者是否声明为内联,程序的可观察行为不会改变。在任何一种情况下,都会在适当的位置调用lock_guard的析构函数。同样,函数中的静态变量引用同一个变量,即使它是内联的(d)或不是。

如果使用
#define
s/macros,但不使用
内联的
,则会出现您描述的效果。事实上,我认为引入内联的原因之一是为了避免不当使用
#define
造成的灾难

我相信这个范围是保留的,使用的方法相当于使用
{
}

// Inlined operations
{  //curly braces create a scope
  std::lock_guard<std::mutex> lock(mMutexObj);

  statement1;
  statement2;
  statement3;
}

// Global scope
global statement1;
global statement2;
...;
//内联操作
{//大括号创建一个作用域
标准:锁和防护锁(mMutexObj);
声明1;
声明2;
声明3;
}
//全球范围
全球声明1;
全球声明2;
...;

注意上面大括号的使用。这是非常有效的代码,当我必须在单个函数中的多个点锁定/解锁互斥时,我倾向于使用它。我猜编译器在内联函数方面也做了类似的事情。

只是为了回答关于“什么百分比的编译器会内联这样的函数”的问题。给定一个“release”构建(即具有高优化级别的构建),我希望所有现代的高质量编译器都内联此代码,假设
语句
不能解析为非常大的内容(例如,反过来内联一个函数,内联另一个函数,内联第三个函数)

我知道一个事实,GCC将内联一个只调用一次的静态函数,即使它很大,因为它实际上删除了一些指令,即使整个“基”函数变大了几千字节

只要编译器认为它“有益”,编译器就会内联小函数,这当然是一个有弹性的术语。但是你可以依靠一些简单的东西,比如把几个整数加在一起,索引到一个向量或数组中,等等,来内联。如果函数稍微复杂一点,例如有几个循环或几个对其他函数的调用,则可能性会降低一点


当然,虚拟函数不会内联,除非对象是什么“显而易见”

内衬是否允许改变范围?我总是想象它在复制的任何东西周围添加
{
}
。@ebyrob我认为改变范围会造成严重破坏。使用#defines可以做到这一点。我认为内联函数的一个原因是为了避免#defines引起的问题
// Inlined operations
{  //curly braces create a scope
  std::lock_guard<std::mutex> lock(mMutexObj);

  statement1;
  statement2;
  statement3;
}

// Global scope
global statement1;
global statement2;
...;