原始数据类型,如char,bool和int有一些内存。假设char有1个字节的内存。当我们在代码中使用char变量时,变量必须要求1个字节的内存。为什么我们不在这种情况下分配内存。而且我们从来没有为它分配内存,它如何使用内存,在这种情况下,CPU是否为它分配内存。我还在某处读取了原始数据类型放在堆栈上并在工作完成时删除。什么样的堆栈?在这种情况下堆栈如何进入画面?为什么没有分配原始数据类型的内存?
回答
当我们创建一个NSString *
变量时,我们也没有为此分配内存。
我们只在调用alloc
时分配内存,可以直接由我们调用,也可以在我们调用的方法内调用。
一种NSString
对象存在于我们已经分配在存储器堆,但NSString *
变量(这是一个指向NSString
对象)存在于内存中,我们不分配在栈上。
例如,假设这两个变量:
NSString *stringOne;
NSString *stringTwo;
到目前为止,无论是已经在堆中分配的任何记忆,他们虽然存在于内存中的完全相同的方式char
,BOOL
,或者int
存在于内存中。
NSString *stringOne = [[NSString alloc] initWithString:@"Hello world"];
NSString *stringTwo = stringOne;
现在发生了什么事?我们在堆上为一个NSString
对象分配了一些内存。然后我们初始化这个内存来表示字符串“Hello world”,然后返回一个指向这个对象的指针并将它分配给stringOne
。
接下来,我们简单地将该指针复制到我们用于stringTwo
的堆栈内存中。我们没有在堆上分配任何额外的内存。我们只是将两个字符串变量指向堆中相同的已分配内存。
question and answer jsd linked in the comments对堆栈和堆内存有更多的解释,它将回答你的一些问题。
还值得注意的是,许多其他编程语言(如C++)允许在堆栈上创建对象,在这种情况下,我们不会像堆对象那样分配它们。它们确实存在于内存中,与原始数据类型更类似。
在过度简化的风险下,数据有三类内存:1)静态,2)堆栈3)堆。
它们以不同的方式分配。
,如果你有
static char something ;
在函数定义
或
char something ;
的功能之外,该数据由链接器使用来自编译器的指令所限定的以及由程序加载器分配。
几乎每个存在的处理器都使用堆栈来支持嵌套数据(例如函数调用)。堆栈是每个进程(和每个处理器模式)都存在的一块内存。有一个称为堆栈指针的硬件寄存器,用于标识堆栈的当前位置。通常SP从堆栈的高端开始向下工作。要在堆栈中分配内存,程序会从堆栈指针中减去所需的字节数。为了释放,它添加到堆栈指针。分配和释放总是在同一端进行。
在堆栈上有两个操作。 PUSH意味着把东西放在堆栈上。 POP删除它。大多数处理器有指令push和pop
如果你有
char something
一个函数中定义的,内存由程序分配所指示的编译器做这样的事情,调整堆栈指针(我在进入功能留出现在帧指针)
SUB BYTESNEEDED, SP
,并通过做
ADD BYTESNEEDED, SP
释放
离开函数之前。在函数执行过程中,局部变量位于堆栈指针的偏移处。
这通常通过使用第二个寄存器来完成,通常称为帧指针。函数通常不会像这样在开始
PUSH FP ; Save the old Frame Point
MOV SP FP ; Save the stack pointer
SUB BYTESNEEDED, SP
末的功能确实像
MOV FP,SP;释放由功能 POP FP分配的所有堆栈;恢复旧的堆栈指针
使用两个寄存器的原因是可以从堆栈动态分配数据。
有一个共同的功能(尽管相信这不是一个标准的C函数)称为ALLOCA被从栈
void dosomething (int amount)
{
char *data = alloca (amount) ;
}
随着ALLOCA分配给malloc的一个替代方案,该数据会自动释放时该函数返回并重置堆栈。
这是一个漫长的回答你的问题。是的,当声明一个字符时,必须有一个分配。但是,这种分配是在幕后完成的,没有您的努力。
- 1. 原始类型的内存分配
- 2. 内存分配原始流vs原始类型表
- 3. 为什么Java中有原始数据类型?
- 4. 为什么没有guava Objects.equal(Object,Object)为原始类型?
- 5. 在原始数据类型分配大小的上下文中,“名义存储分配”是什么意思?
- 6. 内存分配复杂数据类型
- 7. 阵列数据类型内存分配
- 8. 枚举数据类型内存分配
- 9. 为什么Haskell中没有内置的Set数据类型?
- 10. 为什么原始不分配给一个数据节点?
- 11. 没有类型原始
- 12. 为什么原始数据类型在java.util.ArrayList中不允许?
- 13. 为什么分配原型本身
- 14. 为什么用malloc分配的虚拟内存没有发布?
- 15. 为类型化内存视图分配内存的建议方式是什么?
- 16. 为什么.net在初始化2d数组时分配内存?
- 17. 为什么原始类型的数组不被视为对象
- 18. 为什么对象类型需要动态内存和原始类型需要静态内存?
- 19. 为什么我们用int数据为链表分配内存?
- 20. 原始数据类型为空
- 21. 将原始数据分配到分类类别计数
- 22. 为什么malloc()初始化新分配的内存块的值?
- 23. 为什么原始数组的多态类型是危险的
- 24. 分配原型到Object.create原型有什么区别
- 25. 关于mybatis的参数类型为原始数据类型?
- 26. 什么是“符号”的原始数据在JavaScript类型
- 27. SSE数据类型和原始类型
- 28. sas如何为数据类型分配内存
- 29. Go为什么复数是原始数字类型?
- 30. 为什么没有数字数据类型为0 - 4,294,967,294
堆栈和堆是不同类型的内存。你的问题在这里得到了解答:http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap – jsd