草庐IT

memory-layout

全部标签

c++ - 引用是否有存储位置?

引用是否有存储位置,或者它只是另一个位置的别名?这是否因C++版本而异,还是与所有C++版本一致?如果一个引用有一个存储位置,那么它是否只允许像类型这样的指针上的值语义?当您这样使用引用时,它是如何工作的:structaStruct{intaVariable;aClass&aReferencetoaClass;};是占空间还是别名? 最佳答案 latestC++20spec(§9.2.3.3)并且至少自C++2005draftspec以来状态:Itisunspecifiedwhetherornotareferencerequires

c++ - union 内位域的对齐

我对以下代码在内存中的布局方式感到有些困惑:structThing{union{unsignedvalue:24;uint8_tbytes[3];};Thing(intv):value(v){}voidfoo(){printf("Thing%pvalue=%d!\n",this,value);}}__attribute__((__packed__));在Linux上的gcc3.3、4.3或4.6上(没有我能想到的任何特殊选项-只有4.6上的“-Wall-g”),结构的大小始终为4:$pahole./unionstructThing{union{unsignedintvalue;/*4*

c++ - 为什么 Visual C++ 2010 提示 'Using uninitialized memory' ?

我有一个函数,它接受一个指向缓冲区的指针,以及该缓冲区的大小(通过指针)。如果缓冲区不够大,它会返回一个错误值并在输出参数中设置所需的长度://FillBufferisdefinedinanothercompilationunit(OBJfile).//Wholeprogramoptimizationisoff.intFillBuffer(__int_bcount_opt(*pcb)char*buffer,size_t*pcb);我这样调用它:size_tcb=12;char*p=(char*)malloc(cb);if(!p)returnENOMEM;intresult;for(;;

c++ - boost iostream : how to turn ifstream into memory mapped file?

我想要的是简单地打开文件作为内存映射文件进行读取-以便将来以更快的速度访问它(例如:我们打开文件读取它结束,等待并一次又一次地读取它)同时我希望该文件可以被其他程序修改,当他们修改它时,我希望我的ifstream也能修改。如何使用boostiostreams(或boostinterprocess)做这样的事情?我们可以只是tallos-嘿,这个文件应该为所有应用程序进行内存映射?所以我尝试这样的代码:#include#include#includeusingnamespaceboost::iostreams;intmain(intargc,char**argv){streamout;t

c++ - 简单代码导致错误读取变量: Cannot access memory at address

我正在尝试使用支持python的gdbMinGW-builds.我遇到了一个错误。这是一个相当简单的代码,在MSVC下调试时它工作正常。D:\CppProject\c1\bin\Debug>gdbc1.exeGNUgdb(GDB)7.6(copyright,license,bugreport,etcomittedhere)ReadingsymbolsfromD:\CppProject\c1\bin\Debug\c1.exe...done.(gdb)l1#include2#include34usingnamespacestd;56intmain()7{8vectorv;9v.push_b

C++ 原子 : would function call act as memory barrier?

我正在阅读这篇文章MemoryOrderingatCompileTime从中说:Infact,themajorityoffunctioncallsactascompilerbarriers,whethertheycontaintheirowncompilerbarrierornot.Thisexcludesinlinefunctions,functionsdeclaredwiththepureattribute,andcaseswherelink-timecodegenerationisused.Otherthanthosecases,acalltoanexternalfunction

c++ - memory_order_seq_cst 如何与非原子操作同步?

如果使用单个原子变量和std::memory_order_seq_cst,是否保证非原子操作不会被重新排序?例如,如果我有std::atomicquux={false};voidfoo(){bar();quux.store(true,std::memory_order_seq_cst);moo();}是bar()保证在调用store之后不会重新排序,并且moo()在调用之前不会重新排序store,只要我使用std::memory_order_seq_cst,至少从另一个线程的角度来看?或者,换句话说,如果从另一个线程运行,以下假设是否有效?if(quux.load(std::memor

c++ - std::atomic::compare_exchange 与两个 memory_order 参数一起使用的真实示例

您能否给出一个真实世界的例子,其中出于某种原因使用了std::atomic::compare_exchange的两个memory_order参数版本(因此一个memory_order参数版本是不够的)? 最佳答案 在许多情况下,compare_exchange上的第二个内存排序参数设置为memory_order_relaxed。在这些情况下,省略它通常并没有错,只是可能效率较低。这里是一个简单的无锁列表/堆栈示例,它需要compare_exchange_weak上的第二个不同的排序参数,以便避免数据竞争。调用push可以并发执行,但

c# - 1 字节对齐会导致内存损坏吗?

假设您在C++中有一个结构(使用MFC,编译32位),其定义如下:#pragmapack(push,1)structfoo{floatf;intz;DWORDk;BYTEb;inti;};#pragmapack(pop,1)现在您在Windows中使用CreateFileMapping创建一个内存映射文件,然后将此结构的内容写入此内存区域。这是一个全局可访问的内存映射。现在您有了C#应用程序(已编译32位)并且您创建了一个与此类似的结构:[StructLayout(LayoutKind.Sequential,Pack=1)]structfoo{doublef;intz;intk;byt

c++ - C/C++ : Bitwise operators on dynamically allocated memory

在C/C++中,是否有一种简单的方法可以将按位运算符(特别是左移/右移)应用于动态分配的内存?例如,假设我这样做了:unsignedchar*bytes=newunsignedchar[3];bytes[0]=1;bytes[1]=1;bytes[2]=1;我想要一种方法来做到这一点:bytes>>=2;(那么“字节”将具有以下值):bytes[0]==0bytes[1]==64bytes[2]==64为什么值应该是这样的:分配后,字节如下所示:[00000001][00000001][00000001]但我希望将字节视为一长串位,如下所示:[000000010000000100000