jjzjj

alignment

全部标签

c++ - char数组的对齐

STLvector通常是如何实现的?它有一个char[]的原始存储,它偶尔会按某个因素调整大小,然后在元素被push_back时调用placementnew(我应该注意一种非常有趣的语法形式-语言学家应该研究pushed_back这样的动词形式:)然后是对齐要求。所以一个自然的问题出现了,我怎样才能在char[]上调用一个placementnew并确保满足对齐要求。因此,我在2003年的C++标准中搜索“对齐”一词,并找到了这些:第3.9段第5条对象类型具有对齐要求(3.9.1、3.9.2)。完整对象类型的对齐方式是一个实现定义的整数值,表示字节数;对象分配在满足其对象类型对齐要求的地

c++ - struct S { int align; 之间的区别}; (在 struct 关键字之后命名)和 struct { int align; } S; (结构定义后的名称)

#includestructHeader{unsignedlonglongintalignment;};intmain(void){structHeaderheader;//note:wecanloosethe'struct'inC++structHeader*pheader=&header;return0;}上面的程序在C和C++中都能完美编译。但是当我将Header结构更改为:struct{unsignedlonglongintalignment;}Header;它失败并在C中显示以下消息:错误:“Header”的存储大小未知在C++中:error:aggregate‘main()

c++ - "BUS_ADRALN - Invalid address alignment"错误是什么意思?

我们在HPUX上,我的代码在C++中。我们得到了BUS_ADRALN-Invalidaddressalignment在我们的函数调用中的可执行文件中。这个错误是什么意思?相同的功能运行了很多次,然后突然出现了核心转储。在GDB中,当我尝试打印它不在上下文中的对象值时。知道在哪里检查吗? 最佳答案 您遇到了数据对齐问题。这可能是由于尝试通过某种错误的指针读取或写入造成的。数据对齐问题是指指针指向的地址未正确“对齐”。例如,某些体系结构(例如旧的Cray2)要求任何从内存中读取除单个字符以外的任何内容的尝试只能通过指针值的最后3位为0的

c++ - 当我从虚拟基派生 D 时,为什么 VS2015 中的 sizeof(D) 增加了 8 个字节?

我正在使用C++14§3.11/2中的示例:structB{longdoubled;};structD:virtualB{charc;}在clang、g++和VS2015中运行下面的代码片段之后#includestructB{longdoubled;};structD:/*virtual*/B{charc;};intmain(){std::cout我得到了以下结果:clangg++VS2015sizeof(longdouble)16168alignof(longdouble)16168sizeof(B)16168alignof(B)16168sizeof(D)323216alignof

c++ - 警告 #13212 : Reference to ebx in function requiring stack alignment

我正在尝试使用ICC2018编译以下代码:__asm{movebx,xx;xxaddresstoregisters}其中xx是int16类型。这是我的函数中的第一条指令。我使用上面的汇编代码收到以下警告:警告#13212:在需要堆栈对齐的函数中引用ebx令人惊讶的是,当我用eax或esi替换ebx时,我看到警告消失了。我不明白为什么我只看到ebx的问题,据我所知,ebx和eax都具有相同的架构(32位寄存器)。另外,当我用ICC2013编译相同的代码时,我没有看到警告。谁能帮我解决这个警告?谢谢! 最佳答案 如果需要额外对齐,所选平

用于可视化内存对齐的 C++ 工具?

是否有一个工具,也许是visualStudio的插件,可以为我可视化我的类和结构的内存对齐?谢谢! 最佳答案 您可能对使用Cruncher#感兴趣.引用:原文MaciejSiniloblogpost关于Cruncher#。 关于用于可视化内存对齐的C++工具?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1994845/

c++ - 对齐 : warning C4316 in all classes that have aligned members

今天我遇到了很多麻烦,因为我跟踪了一个非常隐蔽的腐败漏洞。我想如果我真的注意警告就不会那么难找到它,但由于找不到有关为什么弹出此特定警告的相关信息,我让它滑动了,这是一个错误。所以这是VisualStudio2013给我的有罪警告:warningC4316:objectallocatedontheheapmaynotbealigned16它是在通过const引用将align(16)临时传递给构造函数时生成的,如以下代码所示:classVector{};__declspec(align(16))classVectorA{};classShape{public:Shape(constVec

c++ - 为什么 gcc 会警告 alignas 值过大?

当用gcc6.3编译时,这个例子程序#includeclassalignas(4096)A{std::arrayarray;};intmain(){Aa;}给出以下警告:3::3:21:warning:requestedalignment4096islargerthan128[-Wattributes]classalignas(4096)A{^虽然gcc7.2没有这样的错误。Example这是否意味着编译器只是通知对齐太大?这种警告的目的是什么?标准不允许编译器忽略此对齐说明符(即使存在警告),是吗? 最佳答案 标准允许allsor

c++ - mmap 是否返回对齐的指针值

mmap()是否保证返回值与系统上的最大对齐对齐?即,是否由POSIX标准保证mmap必须返回alignof(std::max_align_t)的倍数的指针值?我无法在Ubuntulinuxmmap(2)手册页或macosxmmap(2)手册页上找到此信息 最佳答案 是的。http://man7.org/linux/man-pages/man2/mmap.2.html在大多数“流行”的NULL映射的情况下IfaddrisNULL,thenthekernelchoosestheaddressatwhichtocreatethemapp

c++ - C++内存对齐是正确的还是低效的?

我测试这段代码只是想找出c++实际为new运算符保留了多少内存。#includeusingnamespacestd;intmain(){cout(intP3)-reinterpret_cast(intP2))在使用-std=c++11标志编译代码并运行它之后,这是我从x86_64机器上得到的。alignmentofint4addressofintP1=0xa59010addressofintP2=0xa59030addressofintP3=0xa59050thedistanceofintP3andintP2=32intP1value=100isthisapaddingvalue=0i