移动安全面试题—编程基础

static函数,局部变量和全局变量放在哪个段,局部变量一定都是放在栈上吗,特殊情况

static 函数
在 C 语言中,static 关键字可以用于修饰函数和变量。这里我们主要讨论 static 修饰函数的情况。
静态函数(static 函数)只能在其定义所在的源文件中使用,它的作用范围仅限于当前源文件。这可以避免命名冲突,并提高代码的可维护性。在其他源文件中,无法通过函数名访问 static 函数。
局部变量和全局变量放在哪个段
在 C 语言中,程序的内存布局通常分为以下几个段:

  1. 代码段(Code Segment):存放程序的代码。
  2. 数据段(Data Segment):存放已初始化的全局变量和静态变量。
  3. BSS 段(Block Started by Symbol):存放未初始化的全局变量和静态变量。
  4. 堆(Heap):用于动态内存分配。
  5. 栈(Stack):用于存放局部变量和函数调用的上下文信息。

根据这些内存段的定义,局部变量通常存放在栈上,而全局变量根据是否初始化,存放在数据段或 BSS 段。
局部变量一定都是放在栈上吗
在大多数情况下,局部变量是放在栈上的。然而,在某些特殊情况下,局部变量可能不会分配在栈上。一个典型的例子是使用 C11 标准中的 _Thread_local 存储类修饰符声明的局部变量。这种变量在每个线程中都有独立的存储空间,因此它们通常不会分配在栈上。例如:

void some_function() {
    
    
    _Thread_local int local_var; // 这个局部变量不会分配在栈上
}

除此之外,编译器优化也可能影响局部变量的存储位置。例如,编译器可能将某些局部变量放入寄存器中,而不是分配在栈上。这种情况取决于编译器的实现和优化选项。

C++ 内存对象布局(函数,虚函数,纯虚函数),成员函数调用地址是什么样?

  • 普通成员函数不占用对象的内存,它们存储在代码段中。调用普通成员函数时,编译器会在编译时期确定调用的地址。
  • 如果一个类含有虚函数,对象的内存布局中会包含一个虚函数表指针(vptr),指向虚函数表(vtable)。虚函数表是一个函数指针数组,其中存储了虚函数的地址。调用虚函数时,会通过虚函数表指针来确定函数地址。
  • 纯虚函数没有实现,它在虚函数表中的位置会被填充为0。派生类需要实现这个纯虚函数,否则该类也将变成抽象类,不能实例化。

Java栈和c 栈的区别

  • Java 栈是 Java 虚拟机(JVM)的一部分,用于存储 Java 方法调用的局部变量、操作数栈等信息。C 栈是操作系统管理的内存区域,用于存储 C/C++ 函数调用的局部变量和调用信息。
  • Java 栈支持自动内存管理(如垃圾回收),而 C 栈需要程序员手动管理内存,容易产生内存泄漏和栈溢出等问题。
  • Java 栈中的数据类型受到 JVM 规范的限制,而 C 栈具有更大的灵活性,可以存储各种数据类型和结构。

.Java与C++面向对象的区别?

  • 继承:Java 支持单继承,一个类只能继承一个父类;C++ 支持多继承,一个类可以继承多个父类。
  • 抽象类和接口:Java 中,抽象类可以包含抽象方法和具体方法,接口只能包含抽象方法;C++ 中,只有抽象类,没有接口的概念。
  • 访问控制:Java 支持四种访问控制符:public、protected、private 和默认(包访问);C++ 支持三种访问控制符:public、protected 和 private。
  • 内存管理:Java 支持自动内存管理(垃圾回收),C++ 需要程序员手动管理内存,包括 new/delete 操作。
  • 指针:Java 不直接支持指针,引用类型变量实际上是一个指向对象的引用;C++ 支持指针和引用,提供了更多底层操作的能力。

堆和栈的区别?

  • 管理方式:堆是动态分配的内存区域,程序员需要手动申请和释放内存;栈是自动分配和回收的内存区域,由操作系统或编程语言的运行时环境管理。
  • 存储内容:堆主要用于存储动态分配的对象和数据;栈主要用于存储函数调用的局部变量和调用信息。
  • 生命周期:堆中的数据生命周期由程序员控制,可以跨越多个函数调用;栈中的数据生命周期随函数调用开始和结束,局部变量在函数返回时会被销毁。
  • 访问速度:栈的访问速度通常比堆快,因为栈有固定的访问顺序(后进先出,LIFO)并由 CPU 寄存器指向栈顶,而堆的内存访问可能涉及较复杂的内存管理操作。
  • 内存空间:堆的内存空间通常比栈大,因为堆用于存储动态分配的对象,可能需要更多的内存;栈的内存空间相对较小,因为它只用于存储函数调用的临时数据。
  • 碎片问题:堆容易产生内存碎片,因为堆内存的分配和释放是不连续的;栈不容易产生内存碎片,因为栈内存的分配和释放是连续的。

猜你喜欢

转载自blog.csdn.net/u010671061/article/details/132289575
今日推荐