草庐IT

c++ - C++ 的新操作是否可以保证地址返回的对齐?

大多数有经验的程序员都知道数据对齐对于程序的性能很重要。我见过一些程序员编写的程序分配了比他们需要的更大的缓冲区,并使用对齐的指针作为开始。我想知道我是否应该在我的程序中这样做,我不知道C++的新操作返回的地址是否对齐有任何保证。于是我写了一个小程序来测试for(size_ti=0;i(p)%4){cout(p)(p)%4){cout(p)(p)%4){cout(p)我使用的编译器是VisualC++Express2008。看来新操作返回的所有地址都是对齐的。但我不确定。所以我的问题是:有任何保证吗?如果他们有保证,我不必调整自己,如果没有,我必须。 最佳答

c++ - 是否可以保证不会在 C++ 中优化执行内存写入的代码?

C++编译器允许optimizeawaywritesintomemory:{//allthiscodecanbeeliminatedcharbuffer[size];std::fill_n(buffer,size,0);}在处理敏感数据时,典型的方法是使用volatile*指针来确保编译器发出内存写入。下面是VisualC++运行时库(WinNT.h)中的SecureZeroMemory()函数的实现方式:FORCEINLINEPVOIDRtlSecureZeroMemory(__in_bcount(cnt)PVOIDptr,__inSIZE_Tcnt){volatilechar*vp

c++ - Hinnant 的 short_alloc 和对齐保证

我最近遇到了HowardHinnant的short_alloc这是我见过的自定义分配器的最佳示例。但是当我花更多时间研究代码以将其集成到我的个人项目中时,我突然想到提供基于堆栈的分配的arena类可能并不总是返回正确对齐的内存.实际上,我担心只有第一次分配才能保证适当对齐(因为缓冲区本身具有强制对齐),请参见下面的相关代码片段:templateclassarena{staticconststd::size_talignment=16;alignas(alignment)charbuf_[N];char*ptr_;//...};templatechar*arena::allocate(s

c++ - std::array<> 是否只保证在堆栈上分配?

是std::array(我自己没有使用new)保证在C++标准中分配在堆栈而不是堆中?要清楚,我的意思不是newstd::array.我主要想知道,是否允许标准库使用new在其实现中。 最佳答案 TL;DR:是的,它在堆栈上。更长的故事:C++没有堆栈或堆的概念。这些是实现细节,并且至少有一个平台不使用传统堆栈(而是使用堆分配的链表)。它有自动存储和免费存储。new访问空闲存储,“堆栈上”的变量进入自动存储。实际上,为了在空闲存储上分配东西,您必须冒内存不足异常的风险。所以一般规则是保证不扔的东西必须使用自动存储。array做出了这

c++ - 在逗号运算符中,如果没有副作用,是否保证左操作数不会实际执行?

为了显示主题,我将使用C,但同样的宏也可以在C++中使用(有或没有struct),提出了同样的问题。我想出了这个宏#defineSTR_MEMBER(S,X)(((structS*)NULL)->X,#X)它的目的是获取struct的现有成员的字符串(constchar*),这样如果该成员不存在,则编译失败。一个最小的用法示例:#includestructa{intvalue;};intmain(void){printf("a.%smemberreallyexists\n",STR_MEMBER(a,value));return0;}如果value不是structa的成员,代码将无法编

c++ - 在 `std::get<I>` 上使用 `std::tuple` 是否保证对于 `I` 的不同值是线程安全的?

假设我有std::tuplemy_tuple{x0,x1,x2};其中T0、T1和T2是值类型(即不可能有别名)。p>访问my_tuple的元素并使用std::get从多个线程同时改变它们是否安全,只要每个线程访问不同的元素?例子:templatevoidprocess(T&x){/*mutate`x`*/}//...std::thread{[&]{process(std::get(my_tuple));}}.detach();std::thread{[&]{process(std::get(my_tuple));}}.detach();std::thread{[&]{process(

c++ - std::string 是否保证不会自发归还内存?

如果从较小大小的字符串重新分配,std::string不会自发归还分配的内存,标准是否保证?换句话说:std::stringstr="Somequitelongstring,whichneedsalotofmemory";str="";str="Anewquitelongbutsmallerstring";//Guaranteedtonotresultinaheapallocation?我问是因为我依靠这个来避免堆碎片。 最佳答案 没有任何保证。[string.cons]/36定义了将constchar*分配给std::string

c++ - 是否保证在 block 结束之前不会调用 C++ 析构函数?

在下面的C++代码中,我是否保证~obj()析构函数将在//More代码执行之后被调用?或者如果编译器检测到它没有被使用,是否允许编译器提前销毁它?{SomeObjectobj;...//Morecode}我想使用这种技术来避免我不得不记住在block末尾重置一个标志,但我需要在整个block中保持设置标志。 最佳答案 您可以接受-这是C++编程中非常常用的模式。来自C++标准第12.4/10节,指的是何时调用析构函数:foraconstructedobjectwithautomaticstoragedurationwhentheb

c++ - C++ 标准库中的哪些头文件保证包含另一个头文件?

C++标准库头文件可能以未指定的方式相互包含,因此程序员通常不应该依赖一个头文件来包含另一个头文件。但是,在少数情况下,可以保证一个header包含另一个header,或者使某些功能可用,否则这些功能需要包含另一个header。那些是什么情况? 最佳答案 此答案忽略Cheader-和那些。C++库头文件(所有引用均指向N4659):保证包含在:(§23.2.1[utility.syn])(§24.3.1[string.syn])(§26.3.2[array.syn])(§26.3.3[deque.syn])(§26.3.4[forw

c++ - 你能通过保证多个线程不会访问同一个内存来避免锁定吗?

假设我有一个大数组,我想用多个线程处理内容。如果我将每个线程委托(delegate)给一个特定的部分,保证没有重叠,那么假设线程不访问数组之外​​的任何其他内存,这是否消除了任何锁定需求?类似这样的东西(伪代码):globalarray[9000000];do_something(chunk){for(i=chunk.start;i 最佳答案 在符合标准的C++11编译器中,这是安全的[intro.memory]​​(§1.7):Amemorylocationiseitheranobjectofscalartypeoramaxima