草庐IT

memory-alignment

全部标签

c++ - union 的内存对齐问题

如果我们在堆栈中创建这种类型的对象,是否可以保证该对象的内存将正确对齐?unionmy_union{intvalue;charbytes[4];};如果我们在堆栈中创建charbytes[4]然后尝试将其转换为整数,则可能存在对齐问题。我们可以通过在堆中创建它来避免这个问题,但是,union对象有这样的保证吗?逻辑上应该有,但我想确认一下。谢谢。 最佳答案 嗯,这取决于你的意思。如果你的意思是:Willboththeintandchar[4]membersoftheunionbeproperlyalignedsothatImayus

c++ - 不仅性能而且内存大小的内存对齐优化

我们知道当你这样定义A时,A的大小是不同的:classA{shorta;doubleb;shortc;};或者像这样classA{shorta;shortc;doubleb;};我假设我们正在为32位操作系统编译并且我们已经告诉编译器对齐到32位。编译器是否真的很难通过重新排序定义来获得最小大小,同时实现相同的性能? 最佳答案 这太难了。结构特别需要按照与结构定义完全相同的顺序对字段进行排序。这个要求可能是对Pascal没有这样的要求并导致令人惊讶的结果的react。无论如何,并非所有CPU架构都需要对齐或填充。在大多数情况下,它会

c++ - C++中结构的对齐

范围在x86中例如,我们有这样一个结构:structX{inta;charb;//compilerwillpad3bytesheredoublec;};Xx;我觉得x的对齐应该是里面最大的成员,本例中是double,也就是8字节,所以&x应该是8的倍数,对吗?但是,经过一些测试,我的编译器(msvc2013)说&x也可以是4但不是8的倍数。这不是意味着&x.c也是4的倍数吗?我哪里理解错了? 最佳答案 C和C++标准没有就对齐方式给出任何建议[或至少没有确定的规则]。由每个编译器(当然还有编译器的目标)来确定一个好的策略。如果此策略

c++ - PVOID buffer转PCHAR有什么意义?

我在MS代码示例中看到下一个代码:PVOIDalignedBuffer[BUFFER_SIZE/sizeof(PVOID)];PCHARbuffer=(PCHAR)alignedBuffer;hResult=FilterSendMessage(context->Port,&commandMessage,sizeof(COMMAND_MESSAGE),buffer,sizeof(alignedBuffer),&bytesReturned);(alignedBuffer将保存作为重播传递给FilterSendMessage调用的结构数组)将PVOID转换为PCHAR有什么意义,这是否有助于

C++ 指定结构的实际大小

我遇到了C#和C++之间的互操作问题,我通过在native代码和托管代码中定义的结构在我的应用程序的两个“端”之间共享内存。native端的结构定义如下:#pragmapack(push,1)structRayTestCollisionDesc{btVector3hitPosition;btRigidBody*hitBody;RayTestCollisionDesc(btRigidBody*body,btVector3&position):hitBody(body),hitPosition(position){}};#pragmapack(pop)并且在托管(C#)端定义了一个类似的结

c++ - std::allocator 是否处理 C++17 中的过度对齐类型?

C++17引入了std::aligned_alloc和对齐感知new可以进行过度对齐分配,但是std::allocator?它是否处理过度对齐的类型? 最佳答案 在N4659(C++17DIS)中,23.10.9.1[allocator.members],bullet2T*allocate(size_tn);Returns:Apointertotheinitialelementofanarrayofstorageofsizen*sizeof(T),alignedappropriatelyforobjectsoftypeT.与C++1

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

c++ - 在 C : Will alignment break my neck? 中伪造继承

我有一个C结构,用于各种C和C++代码(通过extern"C")。#ifdef__cplusplusextern"C"{#endiftypedefstructAA;structA{/*somemembers*/};#ifdef__cplusplus}#endif分配、初始化和释放是由我控制的独立成员函数完成的,但我不控制对成员的访问,因为它们可以在任何地方访问。问题是,我无法更改整个系统中大量使用的header中struct的定义,但我仍然想扩展类型并添加一些成员。由于这必须编译为C++和C,我不能简单地创建派生类型structB:publicA。所以我的想法是将这种类型添加到cpp文

c++ - 奇怪的数据对齐

据我所知,数据对齐是将数据放入内存中的64位/32位block中以提高CPU性能,我使用的是64位linux机器,我做了一些测试并得到了一些奇怪的结果(我无法解释行为)。这是我使用的结构:classA{longl0,l1,l2;};classB{longl0,l1,l2,l3;};classC{longl0,l1,l2,l3,l4;};测试:intmain(){C*newC=newC();B*newB=newB();A*newA=newA();int*i=newint();std::cout只是将每个对象的1个对象放入堆中,我在末尾添加了一个指针以查看newA占用的内存结果是这样的:2

C++ - 对齐内存

我很想了解这两条线上发生了什么constintPAGES=8*1024;//PAGES+extra4KiBforalignmentuint8_t*mem=newuint8_t[PAGES*CCPU::PAGE_SIZE+CCPU::PAGE_SIZE];//aligntoamutipleof4KiBuint8_t*memAligned=(uint8_t*)((((uintptr_t)mem)+CCPU::PAGE_SIZE-1)&~(uintptr_t)~CCPU::ADDR_MASK);特别是最后一行,我什么都不懂... 最佳答案