是否有一些g++选项显示哪些类是从模板创建的?例如原始源代码中有模板定义:templatestructSomeStruct{Tvariable;};SomeStructinstance;我希望看到SomeStruct的实现。 最佳答案 您可以使用-fdump-class-hierarchy标志获取该信息。它会列出比您要求的更多的内容,但如果搜索以Class开头的行,您会找到您要查找的内容。编辑:这是包含iostream的程序的一些输出。可以看到有char和wchar_t的实例化:Classstd::basic_ostream>Cla
这个问题源于我关于使用通常的ostream&operator输出数值的正确方法的讨论。对于C++中的数字类型。我熟悉每个基数中std::showbase和std::showpos的行为,它们基本上是互斥的。即:十进制不显示底数,正数加'+';而在十六进制或八进制中,会显示基数,但不会显示“+”(也不会显示负号),因为打印的类型值就好像它被转换为无符号类型一样。例如,这个简单(冗长)的程序:#includeintmain(){std::cout使用GCC编译时给出此输出:+5050x5-5017777777777777777777730xfffffffffffffffb这是我一直期望的,
我有一对unsignedint32std::atomic_start;std::atomic_end;有时我想通过比较交换来设置开始或结束,所以我不希望在整个64位对上使用CAS可能导致虚假故障。我只想使用32位CAS。_end.compare_exchange_strong(old_end,new_end);现在我可以将开始和结束作为一个64位原子读取来获取。或者两个单独的32位读取。执行一次64位原子提取(编译器添加适当的内存栅栏)而不是使用两个内存栅栏进行两次单独的32原子位读取(或者编译器会优化它吗?)会不会更快?如果是这样,我将如何在C++11中做到这一点?
例如,考虑用伸展树(SplayTree)实现的std::map。这种树结构是可变的,每次访问map进行读取时都会发生变化。当map为const时,谁必须保证并发读取的隔离,是由用户代码还是由map实现决定的? 最佳答案 提问者知道,如果您有写入集合的线程,则用户必须管理同步锁定。问题似乎是如果同时线程只读取集合,标准是否可以保证线程安全。我不确定旧的C++标准是否对任何操作的线程安全有任何保证,但新标准会(部分已在评论中给出,23.2.2)。事实上,大多数供应商现在确实保证并发读取之间的线程安全,尽管集合中包含的对象内的并发性显然需
用std::uninitialized_fill()初始化内存有意义吗?当用户作为参数传递的分配器已用于获取内存本身时,在库中?我问这个是因为分配器应该提供自己的construct()方法(allocate()方法除外),其实现可能与标准方法不同,因此可能是std::uninitialized_fill()并不总是适用于所有情况。准确的说,我的疑惑来自Stroustrup写的C++书(附录E“Standard-LibraryExceptionSafety”,E.3.1节),书中作者给出了一个templatevector::vector(size_typen,constT&val,con
如果我需要通过std::function调用,使用调试器单步执行函数对象可能会非常困惑。是否可以通过某种方式跳过这些帧? 最佳答案 gdb7.4为此添加了skip系列命令。(gdb)aproposskipinfoskip--Displaythestatusofskipssetstep-mode--Setmodeofthestepoperationshowstep-mode--Showmodeofthestepoperationskip--Ignoreafunctionwhilesteppingskipdelete--Deletesk
我有一个正在处理的项目,在该项目中,std映射有一些奇怪的行为。我定义了自己的typedef映射,它将字符串映射到自定义类型的指针。将第一对添加到map后,只要我超出map,应用程序就会崩溃。经过一番折腾后,我将map更改为a并将其移至我的应用程序中的第一个调用,但它仍然崩溃。我不知道会发生什么。任何帮助,将不胜感激。这是目前崩溃的代码。LoggerPtrsyslogger(Logger::getLogger("CISInterface"));intmain(intargc,char*argv[]){typedefstd::mapMyMapDef;MyMapDeftmpString;t
以下是错误的:vectorvec;问题是模板类型需要是可分配的。以下代码编译[编辑:在VisualStudio2010中],演示了上述问题:vectorvec;vec.push_back(6);vec[0]+=4;对于更复杂的类型,这可能是一个严重的问题。我的第一个问题是这种行为是否有原因。在我看来,有可能制作出不允许上述内容的const容器和允许它的非const容器。其次,有没有办法让容器以这种方式运行?第三,这里实际发生了什么(用户类型)?我意识到这是未定义的行为,但STL是如何编译它的? 最佳答案 原因std::vector不
在一些使用std::ofstream执行大量文件i/o的代码中,我正在缓存流以提高效率。但是,有时我需要更改文件的打开模式(例如追加与截断)。这是一些类似的模拟代码:classLogger{public:voidwrite(conststd::string&str,std::ios_base::openmodemode){if(!myStream.is_open)myStream.open(path.c_str(),mode);/*Want:if(myStream.mode!=mode){myStream.close();myStream.open(path.c_str(),mode)
考虑以下代码:#include#includeusingnamespacestd;templatevoidfun(Tt){t+=8;}intmain(){inti=0;fun(ref(i));cout此代码打印“8”。我假设fun()中的t自动转换为int&。但是如果我用t=8替换t+=8,程序将无法编译。为什么? 最佳答案 reference_wrapper有一个到T&的隐式转换运算符,所以它会被转换成T&无论哪里T&是比reference_wrapper更好的匹配.在扩充赋值表达式中,唯一可行的运算符是int&operator+