一直以来遇到的不懂的名词

备注:解答全部来自于stackoverflow.com
用于给像我一样的小白扫盲,一直都会更新

1.什么是运行时?

运行时runtime描述了在程序运行时执行的软件/指令,尤其是那些您没有明确编写但对于正确执行代码是必需的指令。

诸如C之类的低级语言的运行时非常小(如果有的话)。像Objective-C这样的更复杂的语言允许动态消息传递,它们的运行时间更加广泛。

运行时代码是库代码,但是库代码是一个更通用的术语,它描述了任何库产生的代码。运行时代码专门是实现语言本身功能所需的代码

2.什么是堆栈和堆?

一段代码来解释最简单的区别:

int foo()
{
  char *pBuffer; //<--nothing allocated yet (excluding the pointer itself, which is allocated here on the stack).
  bool b = true; // Allocated on the stack.
  if(b)
  {
    //Create 500 bytes on the stack
    char buffer[500];

    //Create 500 bytes on the heap
    pBuffer = new char[500];

   }//<-- buffer is deallocated here, pBuffer is not
}//<--- oops there's a memory leak, I should have called delete[] pBuffer;

堆栈stack是为执行线程预留的暂存空间。调用函数时,将在堆栈顶部保留一个块,用于存放局部变量和一些bookkeeping数据。当该函数返回时,该块将变为未使用状态,并且可以在下次调用该函数时使用。堆栈始终按LIFO(先进先出)顺序保留;最近保留的块始终是要释放的下一个块。这使得跟踪堆栈非常简单。从堆栈中释放一个块无非就是调整一个指针。

堆heap是为动态分配预留的内存。与堆栈不同,堆中的块分配和释放没有强制的模式。您可以随时分配一个块,并随时释放它。这使得跟踪在任何给定时间分配或释放堆的哪些部分变得更加复杂。有许多自定义堆分配器可用于调整不同使用模式的堆性能。

每个线程都有一个堆栈,而应用程序通常只有一个堆(尽管对于不同类型的分配有多个堆并不少见)。

要直接回答您的问题:

它们在多大程度上受操作系统或语言运行时的控制?

创建线程时,操作系统会为每个系统级线程分配堆栈。通常,语言运行库会调用OS来为应用程序分配堆。

他们的范围是什么?

堆栈连接到线程,因此当线程退出时,堆栈将被回收。通常,堆是在运行时在应用程序启动时分配的,并在应用程序(技术上已退出)退出时被回收。

什么决定了它们的大小?

创建线程时设置堆栈的大小。堆的大小是在应用程序启动时设置的,但是会随着需要的空间而增长(分配器从操作系统请求更多的内存)。

是什么使堆栈速度更快?

堆栈速度更快,因为访问模式access pattern使从中分配内存和取消分配内存变得微不足道(指针/整数只是递增或递减),而堆在分配或释放中具有更为复杂的簿记bookkeeping功能。另外,堆栈中的每个字节都倾向于非常频繁地重用,这意味着它倾向于被映射到处理器的高速缓存中,从而使其非常快。堆的另一个性能损失是,堆(通常是全局资源)通常必须是多线程安全的,即,每个分配和释放都必须(通常)与程序中的“所有”其他堆访问同步。

--------2020年4月3日

3.什么是Android中的上下文context?

取自官方文档:
Context类是“【有关应用程序环境的全局信息】的接口。
通常,您调用它来获取有关程序另一部分(活动和程序包/应用程序)的信息。

4.什么是payload?

通常在传输数据时,为了使数据传输更可靠,要把原始数据分批传输,并且在每一批数据的头和尾都加上一定的辅助信息,比如数据量的大小、校验位等,这样就相当于给已经分批的原始数据加一些外套,这些外套起标示作用,使得原始数据不易丢失,一批数据加上“外套”就形成了传输通道的基本传输单元,叫做数据帧或数据包,而其中的原始数据就是payload

猜你喜欢

转载自blog.csdn.net/jieyannn/article/details/105297965