C++ bal和Local指的是作用域,而不是存储类。可以返回静态局部变量,只要调用方不修改它们。它们仍然在分配它们的函数中起作用。@WhirlWind:我更正了我的回答,以澄清我使用“全局”和“局部”字来指定变量的生存期,这在多线程上下文中才是真正重要的。@Ti
C++ bal和Local指的是作用域,而不是存储类。可以返回静态局部变量,只要调用方不修改它们。它们仍然在分配它们的函数中起作用。@WhirlWind:我更正了我的回答,以澄清我使用“全局”和“局部”字来指定变量的生存期,这在多线程上下文中才是真正重要的。@Ti,c++,c,thread-safety,C++,C,Thread Safety,bal和Local指的是作用域,而不是存储类。可以返回静态局部变量,只要调用方不修改它们。它们仍然在分配它们的函数中起作用。@WhirlWind:我更正了我的回答,以澄清我使用“全局”和“局部”字来指定变量的生存期,这在多线程上下文中才是真正重要的。@Tim Post:可以返回静态局部变量。事实上,您甚至可以返回指向它们的引用/指针,并让调用者修改它们。在多线程上下文中,这可能会产生有趣的结果。它们显然是“范围化”的事实不会改变它们的生存期不是普通局部变量的生存期,而是全局变量的生存期。这是相当
bal和Local指的是作用域,而不是存储类。可以返回静态局部变量,只要调用方不修改它们。它们仍然在分配它们的函数中起作用。@WhirlWind:我更正了我的回答,以澄清我使用“全局”和“局部”字来指定变量的生存期,这在多线程上下文中才是真正重要的。@Tim Post:可以返回静态局部变量。事实上,您甚至可以返回指向它们的引用/指针,并让调用者修改它们。在多线程上下文中,这可能会产生有趣的结果。它们显然是“范围化”的事实不会改变它们的生存期不是普通局部变量的生存期,而是全局变量的生存期。这是相当创新的+1.
int getUniqueID()
{
static int ID=0;
return ++ID;
}
int getUniqueIDBase()
{
static int ID=0;
return ++ID;
}
int getUniqueID()
{
return getUniqueIDBase() << k + thread_id;
}
int getUniqueID()
{
static bool initialized = false;
static int ID;
if( !initialized )
{
sleep(1);
initialized = true;
sleep(1);
ID = 1;
}
sleep(1);
int tmp = ID;
sleep(1);
tmp += 1;
sleep(1);
ID = tmp;
sleep(1);
return tmp;
}
int getUniqueID()
{
static std::atomic<int> ID{0};
return ++ID;
}
int getUniqueID()
{
static int ID=0;
return ++ID;
}
private_to_the_next_function int ID = 0 ;
int getUniqueID()
{
return ++ID;
}
bool isObjectToBeConstructed = false ;
int iteration = 0 ;
struct MyObject
{
MyObject() { std::cout << "*** MyObject::MyObject() ***" << std::endl ; }
~MyObject() { std::cout << "*** MyObject::~MyObject() ***" << std::endl ; }
};
void myFunction()
{
std::cout << " myFunction() : begin with iteration " << iteration << std::endl ;
if(iteration < 3)
{
++iteration ;
myFunction() ;
--iteration ;
}
else if(isObjectToBeConstructed)
{
static MyObject myObject ;
}
std::cout << " myFunction() : end with iteration " << iteration << std::endl ;
}
int main(int argc, char* argv[])
{
if(argc > 1)
{
std::cout << "main() : begin WITH static object construction." << std::endl ;
isObjectToBeConstructed = true ;
}
else
{
std::cout << "main() : begin WITHOUT static object construction." << std::endl ;
isObjectToBeConstructed = false ;
}
myFunction() ;
std::cout << "main() : end." << std::endl ;
return 0 ;
}
main() : begin WITHOUT static object construction.
myFunction() : begin with iteration 0
myFunction() : begin with iteration 1
myFunction() : begin with iteration 2
myFunction() : begin with iteration 3
myFunction() : end with iteration 3
myFunction() : end with iteration 2
myFunction() : end with iteration 1
myFunction() : end with iteration 0
main() : end.
main() : begin WITH static object construction.
myFunction() : begin with iteration 0
myFunction() : begin with iteration 1
myFunction() : begin with iteration 2
myFunction() : begin with iteration 3
*** MyObject::MyObject() ***
myFunction() : end with iteration 3
myFunction() : end with iteration 2
myFunction() : end with iteration 1
myFunction() : end with iteration 0
main() : end.
*** MyObject::~MyObject() ***