出于日志记录的目的,我想检索Python对象的完全限定类名.(完全限定,我的意思是类名,包括包和模块名.)
我知道x.__class__.__name__,但是有一个简单的方法来获得包和模块吗?
我有一个关于使用boost::lock_guard(或类似的作用域锁)和使用应该由return语句中的锁保护的变量的问题.
如何破坏本地对象并复制返回值?返回值优化如何影响这一点?
例:
Data Class::GetData()
{
boost::lock_guard<boost::mutex> lock(this->mMutex);
return this->mData;
}
Run Code Online (Sandbox Code Playgroud)
这是正确的(如果mData是受mMutex保护的变量)吗?或者我是否必须使用本地范围和临时,如下例所示:
Data Class::GetData()
{
Data ret;
{
boost::lock_guard<boost::mutex> lock(this->mMutex);
ret = this->mData;
}
return ret;
}
Run Code Online (Sandbox Code Playgroud) 在阅读了很多关于静态变量初始化的问题之后,我仍然不确定它如何适用const于命名空间级别的变量.
我在构建脚本生成的头文件中有以下代码config.h:
static const std::string path1 = "/xyz/abc";
static const std::string path2 = "/etc";
Run Code Online (Sandbox Code Playgroud)
根据我所读到的,static关键字是没有必要的,甚至在这里弃用.
我的问题:上面的代码是否容易出现静态初始化惨败?
如果我在头文件中有以下内容myclass.h:
class MyClass
{
public:
MyClass(const std::string& str) : m_str(str) {}
std::string Get() const { return m_str; }
private:
std::string m_str;
}
const MyClass myclass1("test");
Run Code Online (Sandbox Code Playgroud)
这会引起静态初始化的任何问题吗?
如果我理解正确,由于const变量具有内部联系,两种情况都应该没有问题?
编辑:(由于运动答案)
也许我应该提一下,我对以下用例感兴趣:
在main.cpp:
#include <config.h>
#include <myclass.h>
std::string anotherString(path1 + myclass1.Get());
int main()
{
...
}
Run Code Online (Sandbox Code Playgroud)
关于这个用例的另一个问题:path2在这种情况下,编译器会优化吗?
有没有办法配置为特定进程放置核心转储文件的目录?
我有一个用C++编写的守护进程,我想为其配置核心转储目录.可选地,文件名模式也应该是可配置的.
我知道/proc/sys/kernel/core_pattern,但这会改变全局的模式和目录结构.
Apache有指令CoreDumpDirectory- 所以它似乎是可能的.
如果我在非模板类中有一个成员函数模板,并且想在类外定义它-我是否必须使用“内联”?
例:
class A
{
template <class D>
void someMethod(D param);
}
template <class D>
/* inline needed here? */ void A::someMethod(D param)
{
}
Run Code Online (Sandbox Code Playgroud)
该标准的第3.2.5节说功能模板不属于一个定义规则。成员功能模板在这方面是否是功能模板?
编辑:没有内联程序,链接器不会抱怨-但仍然-它是否有效的C ++ 03?
编辑:
到目前为止,我了解到的是:gcc(以及假设的其他编译器)也将隐式模板实例导出为弱符号,这意味着如果在多个转换单元中实例化它们,则链接时间内不会发生冲突。由于弱符号不是标准的一部分-标准是否以某种方式隐式要求模板实例化以这种方式运行,我是否可以期望其他符合标准的编译器/链接器组合具有相同的行为?
由于内嵌基本上忽略了优化,但是允许在不同的翻译单位功能的多个定义,这暗示转化为出口这些功能弱符号。这是否意味着将模板声明为内联是多余的?
我需要一个非常快(在某种意义上"读取器的低成本",而不是"低延迟")线程之间的更改通知机制,以便更新读取缓存:
情况
线程W(Writer)S仅在一段时间内更新数据结构()(在我的情况下是地图中的设置).
线程R(Reader)维护缓存S并且经常读取它.当线程W更新S线程R需要在合理的时间(10-100ms)内通知更新.
架构是ARM,x86和x86_64.我需要支持C++03gcc 4.6及更高版本.
码
是这样的:
// variables shared between threads
bool updateAvailable;
SomeMutex dataMutex;
std::string myData;
// variables used only in Thread R
std::string myDataCache;
// Thread W
SomeMutex.Lock();
myData = "newData";
updateAvailable = true;
SomeMutex.Unlock();
// Thread R
if(updateAvailable)
{
SomeMutex.Lock();
myDataCache = myData;
updateAvailable = false;
SomeMutex.Unlock();
}
doSomethingWith(myDataCache);
Run Code Online (Sandbox Code Playgroud)
我的问题
在线程R中,"快速路径"中没有发生锁定或障碍(无可用更新).这是一个错误吗?这个设计有什么后果?
我需要有资格updateAvailable的volatile?
最终 …
首先,我不知道我的问题是否有解决办法.
我有以下情况:
现在我还需要创建框架库的共享对象.此外,依赖项可用作共享库,因此不需要任何静态链接.
我现在遇到的问题:
我的问题:
如果我知道我的应用程序不会使用依赖于此共享对象的框架库的任何代码,是否有任何方法可以忽略某些共享对象依赖项?
有没有办法在没有代码更改的情况下执行此操作?(链接器/编译器开关)
我还需要原始情况中描述的静态链接仍然有效.
附加信息:
对于boost::weak_ptr该operator<定义,使其能够在关联容器中使用.
我的问题是:几个weak_ptr对象的排序顺序是否稳定,即使它们中的一些变为零的引用数量?容器不是那么乱std::set吗?
例:
using namespace boost;
shared_ptr<A> sptrA1(new A);
weak_ptr<A> wptrA1 = sptrA1;
weak_ptr<A> wptrA2;
{ // begin Scope 1
shared_ptr<A> sptrA2(new A);
wptrA2 = sptrA2;
assert(wptrA1 < wptrA2); // assert #1
}
assert(wptrA1 < wptrA2); // assert #2
Run Code Online (Sandbox Code Playgroud)
wptrA2范围1之前和之后是否处于相同的状态?