草庐IT

应不应该

全部标签

c++ - 我应该如何将 placement new 与自定义分配 API 一起使用?

我正在处理一些具有自定义分配和删除的内存空间,这些内存空间是使用类似malloc的接口(interface)创建的,不受我的控制(即不透明的C风格函数,用于“分配n个字节”或“释放一个字节”分配的指针”)。所以,没有什么比new或delete更好的了。现在,我想构造一个T的数组。我通过autospace_ptr=custom_alloc(n*sizeof(T))获得了空间。现在我想做一些类似array-placement-new的事情来就地构造n元素。我该怎么做?...或者我应该从1循环到n并构建单个T?注意:我在这里忽略对齐问题(或者更确切地说,假设alignof(T)划分sizeo

c++ - 什么时候应该使用 const_iterator 而不是 auto

下面是一个例子,我认为它说明了使用const_iterator比使用“constauto”更可取的情况。这是因为容器不提供cfind()函数。还有其他选择吗?或者应该使用“constauto”而忽略const的缺失?std::stringGetJobTitle(conststd::string&employee){usingEmployeeTitles=std::unordered_map;EmployeeTitlesemployees={{"Alice","Director"},{"Bob","Manager"},{"Charlie","Developer"}};//Option1.

c++ - 当文件无法打开时我应该关闭它吗?

我应该关闭无法打开的文件吗?我应该这样写吗:std::ifstreamfile(DATA_PATH);if(!file.good())//Filedoesn'texist{//dosomething}else//fileexists{//dosomethingfile.close();}或者我应该写:std::ifstreamfile(DATA_PATH);if(!file.good())//Filedoesn'texist{//dosomething}else//fileexists{//dosomething}file.close(); 最佳答案

c++ - 我应该把我的 DECLSPEC 放在哪里?

给定以下命名空间,我要将declspec(用于dll导出)放在哪里我希望将所述命名空间中的所有方法导出到DLL中?namespaceAguiText{voiddrawTextArea(AguiGraphicsManager*g,constAguiFont&font,constAguiRectangle&area,constAguiColor&color,conststd::vector&lines,AguiHorizontalAlignmentEnumhorizontalAlignment,AguiVerticalAlignmentEnumverticalAlignment);void

c++ - 标准应该在源代码中指定还是在 CPPFLAGS 中指定?

#define_BSD_SOURCE还是设置CPPFLAGS=-D_BSD_SOURCE更好?在我看来,如果一段源代码依赖于特定标准,最好在代码本身中使用#define明确说明。但是,很多评论建议在编译行上指定标准更为合适。从源代码中省略标准并仅在编译时指定它有什么优点? 最佳答案 如果您在源代码中指定定义,则存在相同的头文件可能包含在多个源文件(翻译单元)中但具有不同的预处理器定义的风险,这可能导致违反单一定义规则,这通常是一种痛苦调试。通过为整个项目而不是在单个源文件中指定定义,可以最大限度地减少违反单一定义规则的可能性。此外,

c++ - std::map 应该如何与没有默认构造函数的值一起使用?

我有一个要放入map中的值类型。它有一个很好的默认复制构造函数,但没有默认构造函数。我相信只要我远离使用operator[]一切都会好的。但是我最终得到了像这样的非常丑陋的构造来实际插入一个对象。(我认为如果该键已经有一个值,插入就会失败)。//equivalenttom[5]=xbutwithoutdefaultconstructionstd::map::iteratorit=m.find(5);if(it!=m.end()){m->second=x;}else{m->insert(std::make_pair(5,x));}我相信这会扫描两次map,而且看起来也很丑。有没有更简洁/

c++ - std::fstream 应该如何工作?

我刚刚开始想知道-std::fstream实际上是如何用std::ios::in和std::ios打开的::out实际上应该工作?它应该做什么?写一些东西到(例如)一个空文件,然后读取......什么?只是书面值(value)?文件“指针”/“光标”在哪里?也许答案已经在那里,但我就是找不到。 最佳答案 什么是std::fstream?std::fstream是双向文件流类。也就是说,它为文件的输入和输出提供了一个接口(interface)。当用户需要读取和写入相同的外部序列时,通常会使用它。当实例化双向文件流时(不同于std::o

c++ - 实例化模板时,其不完整参数类型的成员是否应该可见?

在下面的例子中,A有一个成员typedefInstantiate这会导致B的实例化.templatestructB{typedeftypenameT::BeforeBefore;//oktypedeftypenameT::AfterAfter;//error:notypenamed'After'in'A'};templatestructA{typedefintBefore;typedeftypenameB::AfterInstantiate;typedefintAfter;};templatestructA;//instantiateA我试过的所有编译器都报告说,而A::Before可

c++ - std::numeric_limits<T>::digits 应该代表什么?

我正在编写一个类似整数的类,它代表一个位于某个范围内的值。例如,bounded::integer的值位于[0,10]范围内的某处。对于这个类,我定义了radix成为2.digits的值应该是多少?为bounded::integer?那bounded::integer呢?? 最佳答案 在进一步阅读标准并思考这个问题后,我相信我有最好的答案,但我不确定。首先是digits的定义,取自最新的C++14标准草案,N3797,§18.3.2.4:staticconstexprintdigits;8Numberofradixdigitsthat

c++ - ldexp 应该正确舍入

我对MSVCldexp的行为感到有点惊讶(它发生在VisualStudio2013中,但也发生在至少到2003年的所有旧版本中......)。例如:#include#includeintmain(){doubleg=ldexp(2.75,-1074);doublee=ldexp(3.0,-1074);printf("g=%ge=%g\n",g,e);return0;}打印g=9.88131e-324e=1.4822e-323第一个g奇怪的圆了...它是2.75*fmin_denormalized,所以我绝对期待第二个结果e。如果我计算2.75*ldexp(1.0,-1074),我会正确