草庐IT

延时分配

全部标签

c++ - 在函数调用中从 %esp 中减去分配了多少空间?

C++,ATT汇编我有以下汇编代码:push%ebpmov%esp,%ebpsub$0x28,%esp(...)我的教科书声称通过从%esp中减去0x28(作为堆栈形成的一部分),为变量分配了12个字节。为什么从栈中减去十进制40会分配12个字节? 最佳答案 这会在堆栈上分配40个字节。但是,除了局部变量之外,它还有其他用途,所以我猜测其余部分用于对齐和future函数调用的参数。由于函数参数也在堆栈上传递,因此需要为该函数要传递给另一个函数的任何空间留出空间。可以在使用push执行调用时分配此空间,但在函数开头分配一次空间并仅使用

c++ - 为什么我无法在 for 循环中访问动态分配的内存?

我为从基类instrument继承的子类类型stock新建了一个内存,当我尝试访问我的数组的第二个元素时,它抛出错误。当我的新数组大小为1时一切正常#include#include#includeusingnamespacestd;classInstrument{public:virtualvoiddisplay(){}virtualvoidoutput(){}virtualvoidreadFile(){}virtual~Instrument(){}};classStock:publicInstrument{public:Stock(){}virtualvoidinput(){cout

c++ - 初始化原子指针是原子的吗?如果初始化或内存分配抛出会发生什么?

如果我一次性声明并定义一个原子指针,比如-std::atomiciptr=newint(1);std::atomiciptr=newT();据我了解,整个操作不是原子的。newT()涉及分配内存,构造T对象,然后自动分配给iptr。T可能很容易构造,在这种情况下,构造T不应抛出异常,但某些用户定义的T可能会抛出异常。如果在T构造或内存分配之间某个其他线程使用iptr怎么办?这个操作真的是原子的吗?使其成为原子的一种方法是打破声明和定义,例如T*temp=newT();std::atomiciptr=temp;有没有其他方法可以原子地做同样的事情?我的理解有问题吗?

c++ - 在 64 位系统的低地址分配内存的最可靠/可移植的方法是什么?

我需要分配位于前32GB虚拟地址空间内的大内存块(供我的自定义分配器使用)。我想,如果我需要,比方说,1MBblock,我可以使用mmap和MAP_FIXED_NOREPLACE(或VirtualAlloc)从低地址开始以递增的方式进行迭代,比如说,1MB,直到调用成功。从上一个成功的block继续下一个block。这听起来很笨拙,但至少它对操作系统地址空间布局变化和ASLR算法变化有一定的鲁棒性。根据我对当前操作系统布局的理解,前32GB应该有足够的可用内存,但也许我遗漏了什么?在Windows、Linux、OSX、iOS或Android中有什么东西可以击败这个方案吗?有没有更好的办

c++ - 为每个节点分配深度

我在这里阅读了其他几篇看起来相似的文章,但没有完全回答我的问题。我得到了一个分配问题,为二叉树中的每个节点分配其各自的深度。我就是不太明白。作为引用,这是我的代码:structtreeNode{intitem;intdepth;treeNode*left;treeNode*right;};typedeftreeNode*Tree;intassignDepth(Tree&T,intdepth){if(T!=NULL){depth=assignDepth(T->left,depth++);T->depth=depth;depth=assignDepth(T->right,depth++);

c++ - 为什么这个源码要分配16个字节?

(gdb)disas/mmainDumpofassemblercodeforfunctionmain():2{0x080483f4:push%ebp0x080483f5:mov%esp,%ebp0x080483f7:sub$0x10,%esp3inta=1;0x080483fa:movl$0x1,-0x4(%ebp)4intb=10;0x08048401:movl$0xa,-0x8(%ebp)5intc;6c=a+b;0x08048408:mov-0x8(%ebp),%eax0x0804840b:mov-0x4(%ebp),%edx0x0804840e:lea(%edx,%eax,1)

c++ - C++中的字符串分配

当我注意到一些奇怪的事情时,我正在玩重载new和delete运算符。我有:void*operatornew(size_tsize){std::cout当我这样做时:intmain(){int*x=newint(1);std::cout一切都按预期进行,我得到:Allocatingmemory...1但是当我这样做的时候:intmain(){std::string*s=newstd::string("Helloworld");std::cout我得到:Allocatingmemory...Allocatingmemory...Helloworld事实上,当我这样做的时候:intmain(

c++ - 如何控制运算符[]分配的值

我知道如何重载operator[]如下:T&operator[](intidx){returnTheArray[idx];}Toperator[](intidx)const{returnTheArray[idx];}但我想要的是控制arr[i]=value赋值。我想控制值在0到9之间。有什么语法可以这样做吗? 最佳答案 您必须编写一个模板类来保存对数组(T类型)中元素的引用,在该模板中您实现赋值运算符,然后您可以在其中实现您的检查。然后从[]运算符返回此模板类的对象。像这样:templateclassRangeCheck{publi

c++ - 在 C++ 中,为什么动态创建对象需要 `new` 而不仅仅是分配?

我有这个简单的类层次结构:classBase{public:virtualintx()const=0;};classDerived:publicBase{int_x;public:Derived(intx):_x(x){}intx()const{return_x;}};如果我使用malloc分配一个Derived的实例,然后尝试访问多态函数x,程序崩溃(我得到段错误):intmain(){Derived*d;d=(Derived*)malloc(sizeof(Derived));*d=Derived(123);std::coutx()当然,我的实际应用要复杂得多(它是一种内存池)。我很

c++ - 存储分配器 - 它是什么?

我知道C和C++中的存储类(static、extern、auto、register,C++还添加了可变的和一些特定于编译器的类)但我不知道什么是存储分配器是。我不认为它指的是可在STL上实现的内存分配器,简单来说它是什么? 最佳答案 它是operatornew和operatordelete后面的任何东西(不要与new运算符和delete运算符)。operatornew从空闲存储中分配内存,operatordelete释放先前由operatornew分配的内存,以便可能的重用。当代码执行foo*ptr=newfoo(new运算符)时,