标签: stack-memory

堆栈与堆 - *向量内的对象是否应该声明为指针?

如果我使用这条线

std:vector<MyObject>* vec = new std::vector<MyObject>(100);
Run Code Online (Sandbox Code Playgroud)
  • 如果我在堆栈中创建 MyObject 并将它们添加到向量中,它们将保留在堆栈中,对吗?
MyObject obj1;
vec->push_back(obj1);
Run Code Online (Sandbox Code Playgroud)
  • 那么,如果它进入堆栈,那么添加到向量中的 MyObject 将在方法结束后消失?向量里面会有什么?垃圾?

  • 我应该用这个代替吗?:

    std:vector<MyObject*>* vec = new std::vector<MyObject*>(100);

如果是这样,那么每个 MyObject 内的对象和基元又如何呢?它们也应该动态创建吗?

谢谢

c++ heap-memory stdvector stack-memory

2
推荐指数
1
解决办法
626
查看次数

Windows 堆栈和堆地址范围

到目前为止,我在使用 Linux 时,堆栈地址非常高,而堆地址非常低(通过使用 C 程序打印堆和堆栈地址可以看出),我对 Win32 进程内存布局有一个问题。MWSDN说堆栈地址高于堆地址,但从我在实践中看到的情况来看,堆栈地址低于堆地址。所以我很困惑。有人请解释一下。

memory winapi process heap-memory stack-memory

1
推荐指数
1
解决办法
3570
查看次数

强制 GCC 在调用函数之前将参数压入堆栈(使用 PUSH 指令)

我已经开始在 GCC/G++ 下开发一个小型 16 位操作系统。我正在使用 GCC 交叉编译器,它是在 Cygwin 下编译的,我将 asm(".code16gcc\n") 作为每个 .CPP 文件的第一行,使用 Intel ASM 语法和命令行来编译和链接.CPP 文件如下所示:

G++: i586-elf-g++ -c $(CPP_FILE) -o $(OBJECT_OUTPUT) -nostdinc -ffreestanding -nostdlib -fno-builtin -fno-rtti -fno-exceptions -fpermissive -masm=intel

LD: i586-elf-ld -T $(LD_SCRIPT) $(OBJECT_OUTPUT) -o $(BINARY_OUTPUT)
Run Code Online (Sandbox Code Playgroud)

我目前面临的问题是GCC 将函数调用代码翻译成汇编的方式。

更具体地说,GCC 不使用 PUSH 指令来传递参数,而是“计算”参数相对于 ESP 的偏移量,然后使用 MOV 指令手动写入堆栈。

这对我来说没有好处,因为我依赖汇编代码中的 PUSH 指令。为了更清楚地说明我的问题,请使用以下两个函数:

void f2(int x);

void f1(){
    int arg = 8;
    asm("mov eax, 5");  // note: super hacky unsafe use of GNU C inline asm
    asm("push eax");    // Writing registers without …
Run Code Online (Sandbox Code Playgroud)

x86 gcc arguments inline-assembly stack-memory

1
推荐指数
1
解决办法
6353
查看次数

将指针作为C++类中的成员字段是愚蠢的吗?

我想检查我理解正确.如果我在标题中有以下内容:

public Obj * objPtr;
Run Code Online (Sandbox Code Playgroud)

以及课堂上的以下内容:

void create() {
    //create a local variable object
    Obj localVar = object();
    objPtr = &localVar;
}

void edit(){
    //attempt to edit value of member pointer
    objPtr->edit();
}
Run Code Online (Sandbox Code Playgroud)

我是否认为它永远不会起作用?因为localVar是本地的,它会在create函数之外被销毁一次,使objPtr具有空内存的地址,这意味着objPtr是一个空指针?

其次,如果我做了它会工作: Obj localVar = new object()或者 objPtr = new object()

c++ pointers heap-memory stack-memory

1
推荐指数
1
解决办法
109
查看次数

python中函数参数存储在哪里?堆?还是堆?

我在线程对象中有一个函数,这个函数接受几个参数,我不知道当许多线程尝试使用这个函数时,这个线程是否会改变另一个线程的参数值?

我可以使用锁,但在分配参数之后。如果参数存储在堆栈中,我猜它们将位于每个线程堆栈中,但是如果它们位于堆中,如何避免线程更改另一个线程函数参数?

python memory multithreading heap-memory stack-memory

1
推荐指数
1
解决办法
771
查看次数

C ++在哪里在内存中创建堆栈和堆?

我正在使用Microsoft Visual Studio 2008

当我创建一个指向对象的指针时,它将收到一个内存地址,在本例中为8位十六进制数。例如:0x02e97fc0

计算机使用8位十六进制数字可以寻址4GB的内存。我的计算机中有8GB的内存:

  1. 这是否意味着我的IDE占用的内存不超过4GB?

  2. IDE是否只能处理内存的前4GB或未使用的8GB中的任何4GB?

问题不仅在于所用内存的大小。它还与所用内存的位置有关。此处没有详细介绍:Windows上任何单个进程可以处理的最大内存量

c++ memory memory-management heap-memory stack-memory

1
推荐指数
1
解决办法
410
查看次数

使用Static对内存管理是否更好?

在大约像静态一些文章和教程这个这个,据说使用静态还是不错的内存管理,因为静态变量类地区的类加载的时间变内存只有一次。

但是我的朋友告诉我,静态方法保存在堆栈中,因为管理堆比堆栈容易,并且垃圾收集器仅在堆上起作用,并且只要应用程序正在运行,就不会清除堆栈,因此请尽量少使用静态方法。您可以。

注意:

我已经在stackoverflow中阅读了有关堆栈内存的相同问题,但是我没有得到太多,因为使用“ PermGen空间”和我不知道的其他词,它们有些复杂和专业。

我希望有人简单地解释我朋友的预付款是否正确?

我知道这取决于,想象一下我既可以使用静态方法也可以使用静态方法进行设计。谈论哪个内存管理更好的方法?

java static memory-management heap-memory stack-memory

1
推荐指数
1
解决办法
311
查看次数

堆栈上的数组内存分配

我在 C 中有 2 个函数:

void func1(unsigned char x)
{
    unsigned char a[10][5];

    a[0][0] = 1;
    a[9][4] = 2;
}

void func2(unsigned char x)
{
    unsigned char a[10][5];

    a[0][0] = 1;
    a[9][4] = 2;

    unsigned char b[10];

    b[0] = 4;
    b[9] = 5;
}
Run Code Online (Sandbox Code Playgroud)

编译:

gcc 7.3 x86-64

-O0 -g

操作系统:

16.04.1-Ubuntu x86-64

生产的英特尔功能组装:

func1(unsigned char):
  pushq %rbp
  movq %rsp, %rbp
  movl %edi, %eax
  movb %al, -68(%rbp)
  movb $1, -64(%rbp)
  movb $2, -15(%rbp)
  nop
  popq %rbp
  ret

func2(unsigned char):
  pushq …
Run Code Online (Sandbox Code Playgroud)

c memory arrays assembly stack-memory

1
推荐指数
1
解决办法
142
查看次数

ARM64 中堆栈指针的行为

由于 ARM64 中缺少 PUSH 和 POP 指令,我在理解 SP 在 ARM64 中的工作方式时遇到了问题。

如果我要 PUSH/POP,SP 是否会减少/增加 4、8 或 16 个字节?

我正在阅读文档说堆栈帧必须按 16 字节对齐,但是当我调试时,情况似乎并非如此。

assembly abi memory-alignment stack-memory arm64

1
推荐指数
1
解决办法
620
查看次数

堆栈如何区分不同的数字类型?

我正在尝试学习汇编,但在理解堆栈上的内存分配/检索时遇到了一些麻烦。

当字符串在堆栈上分配时,程序知道当它到达空终止字符时停止读取字符串/x00。然而,对于数字,没有这样的事情。程序如何知道堆栈上分配的数字的结尾,以及如何区分不同的数字类型(short、long、int)?(我对此有点陌生,所以请纠正我可能误解的任何内容!)

c assembly types integer stack-memory

1
推荐指数
1
解决办法
93
查看次数