草庐IT

memory-alignment

全部标签

c++ - 在哪里可以找到有关跨不同平台/编译器的 C++ 内存对齐的文档?

我正在寻找有关C++中的内存对齐、典型方法、编译器之间的差异以及常见陷阱的优秀(综合)文档。只是为了检查我对主题的理解是否正确并学习新知识。这个问题的灵感来自于我对另一个问题的回答,其中我使用了以下结构:charconstbuf[1000]=...;unsignedinti=*reinterpret_cast(buf+shift);//shiftcanbeanything它被批评为不符合内存对齐规则。您能否从内存对齐的角度解释为什么这种方法存在缺陷?一个不起作用的例子将不胜感激。我知道这通常是一种不好的方法,但我经常在网络协议(protocol)实现中使用它,所以它更像是一个实际问题而

c++ - 缓存行对齐(需要在文章中说明)

我最近在我的应用程序中遇到了一个我认为是错误共享的问题,并且我查找了Sutter'sarticle关于如何将我的数据与缓存行对齐。他建议使用以下C++代码://C++(usingC++0xalignmentsyntax)templatestructcache_line_storage{[[align(CACHE_LINE_SIZE)]]Tdata;charpad[CACHE_LINE_SIZE>sizeof(T)?CACHE_LINE_SIZE-sizeof(T):1];};当CACHE_LINE_SIZE>sizeof(T)为真时,我可以看到它是如何工作的——结构cache_line

c++ - 简单 CUDA 测试总是失败并出现 "an illegal memory access was encountered"错误

如果我运行这个程序,我会收到“在第48行的matrixMulti.cu中遇到非法内存访问”错误。我搜索并尝试了很多。所以我希望有人能帮助我。Line48:HANDLE_ERROR(cudaMemcpy(array,devarray,NNsizeof(int),cudaMemcpyDeviceToHost));该程序只是为了进入CUDA。我尝试实现矩阵乘法。#include#include#includeusingnamespacestd;#defineHANDLE_ERROR(err)(HandleError(err,__FILE__,__LINE__))voidprintVec(in

c++ - "points to uninitialised byte(s)"Valgrind 错误

我一直在使用Valgrind来查找我的代码中的内存泄漏,虽然没有发现内存泄漏,但报告了一些错误,所有这些错误都源于单个函数/类方法:==17043==ERRORSUMMARY:10100errorsfrom3contexts(suppressed:0from0)==17043====17043==100errorsincontext1of3:==17043==Syscallparamsocketcall.sendto(msg)pointstouninitialisedbyte(s)==17043==at0x5441DA2:send(send.c:28)==17043==by0x404C

c++ - std::optional 实现为 union vs char[]/aligned_storage

在阅读GCC对std::optional的实现时,我注意到了一些有趣的事情。我知道boost::optional实现如下:templateclassoptional{//...private:boolhas_value_;aligned_storagestorage_;}但是libstdc++和libc++(以及Abseil)都像这样实现它们的可选类型:templateclassoptional{//...private:structempty_byte{};union{empty_byteempty_;Tvalue_;};boolhas_value_;}在我看来,它们在功能上是相同的

c++ - 为什么我收到未对齐指针的警告而不是引用

我有一个项目要从32位Windows移植到64位,其中包含可以简化如下的代码:voidFuncA(double&x){x=0;}voidFuncB(double*x){*x=0;}#pack(1)struct{charc;doublex;}MyStruct;#pack();voidMyFunc(){MyStructM;FuncA(M.x);//ThisisOKFuncB(&M.x);//ThisgeneratesawarningC4366}在针对64位的VS2010SP1下编译时,使用打包结构的成员调用FuncB会生成以下警告:警告C4366:一元“&”运算符的结果可能未对齐而调用Fu

c++ - std::aligned_storage 的目的是什么?

如果我理解正确的话,std::aligned_storage的主要优点是它管理对齐。它还可以使用memcpy()进行复制,并且可以与POD类型一起使用。但是!1)POD类型默认由编译器对齐,我们可以使用#pragmapack(push,1)覆盖编译器的对齐方式2)默认情况下,我们可以使用memcpy()复制POD(我们不应该为此做些什么)所以我真的不明白为什么我们需要std::aligned_storage? 最佳答案 只要您希望将内存分配与对象创建分离,就可以使用std::aligned_storage。您声称:Alsoitisu

c++ - 错误 C2719 : '_Val' : formal parameter with __declspec(align ('16' )) won't be aligned?

我正在尝试为D3DXMATRIXA16创建一个vector像这样:vectormatrices;并收到错误:d:\ProgramFiles\MicrosoftVisualStudio9.0\VC\include\vector(717):errorC2719:'_Val':formalparameterwith__declspec(align('16'))won'tbealignede:\projects\emuntitled\em\emscratch\emshadow.h(60)::seereferencetoclasstemplateinstantiation'std::vector

c++ - 如何找出导致 "cv::Exception at memory location"的原因?

我目前遇到一些奇怪的异常,这很可能是由于我在与opencv交互时做错了什么:xxx.exe中0x7580b9bc处的第一次机会异常:MicrosoftC++异常:cv::Exceptionatmemorylocation0x00c1c624..我已经在Debug->Exceptions菜单中启用了Thrown字段,但是我真的无法弄清楚在我的代码中哪里抛出了异常。我该如何调试它?编辑堆栈框架如下所示(我的应用程序甚至不会出现在列表中!):KernelBase.dll!7580b8bc()[以下框架可能不正确或缺失]KernelBase.dll!7580b8bc()opencv_core2

c++ - C++类的大小是如何确定的?

总结:编译器在编译过程中如何静态确定C++类的大小?详细信息:我试图了解用于确定一个类将使用多少内存以及如何对齐内存的规则。例如,下面的代码声明了4个类。前2个都是16个字节。但是3是48字节,尽管它包含与前2相同的数据成员。而第四类与第三类具有相同的数据成员,只是顺序不同,但它是32字节。#include#includeclassTestClass1{__m128ivect;};classTestClass2{charbuf[8];charbuf2[8];};classTestClass3{charbuf[8];__m128ivect;charbuf2[8];};classTestC