C++面试题(三)

news/2024/10/5 7:25:50

1、程序有哪些section,分别的作用?程序启动的过程?怎么判断数据分配在栈上还是堆上?

image

如上图,从低地址到高地址,一个程序由代码段、数据段、 BSS 段组成。

\1. 数据段:存放程序中已初始化的全局变量和静态变量的一块内存区域。

\2. 代码段:存放程序执行代码的一块内存区域。只读,代码段的头部还会包含一些只读的常数变量。

\3. BSS 段:存放程序中未初始化的全局变量和静态变量的一块内存区域。

\4. 可执行程序在运行时又会多出两个区域:堆区和栈区。

堆区:动态申请内存用。堆从低地址向高地址增长。

栈区:存储局部变量、函数参数值。栈从高地址向低地址增长。是一块连续的空间。

2、程序启动的过程:

\1. 操作系统首先创建相应的进程并分配私有的进程空间,然后操作系统的加载器负责把可执行文件的数据段和代码段映射到进程的虚拟内存空间中。

\2. 加载器读入可执行程序的导入符号表,根据这些符号表可以查找出该可执行程序的所有依赖的动态链接库。

\3. 加载器针对该程序的每一个动态链接库调用LoadLibrary

(1)查找对应的动态库文件,加载器为该动态链接库确定一个合适的基地址。

(2)加载器读取该动态链接库的导入符号表和导出符号表,比较应用程序要求的导入符号是否匹配该库的导出符号。

(3)针对该库的导入符号表,查找对应的依赖的动态链接库,如有跳转,则跳到3

(4)调用该动态链接库的初始化函数

\4. 初始化应用程序的全局变量,对于全局对象自动调用构造函数。

\5. 进入应用程序入口点函数开始执行。

*3、怎么判断数据分配在栈上还是堆上:

首先局部变量分配在栈上;而通过malloc和new申请的空间是在堆上。

初始化为0的全局变量在bss还是data?

BSS段通常是指用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域。特点是可读写的,在程序执行之前BSS段会自动清0。

4、简述C++中内存对齐的使用场景

内存对齐应用于三种数据类型中:struct/class/union

struct/class/union内存对齐原则有四个:

\1. 数据成员对齐规则:结构(struct)或联合(union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小的整数倍开始。

\2. 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部"最宽基本类型成员"的整数倍地址开始存储。(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储)。

\3. 收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的"最宽基本类型成员"的整数倍。不足的要补齐。(基本类型不包括struct/class/uinon)。

\4. sizeof(union),以结构里面size最大元素为union的size,因为在某一时刻,union只有一个成员真正存储于该地址。

什么是内存对齐?

那么什么是字节对齐?在C语言中,结构体是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构体、联合体等)的数据单元。在结构体中,编译器为结构体的每个成员按其自然边界(alignment)分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构体的地址相同。

为了使CPU能够对变量进行快速的访问,变量的起始地址应该具有某些特性,即所谓的对齐”比如4节的int型,其起始地址应该位于4字节的边界上,即起始地址能够被4**整除,也即“对齐”跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。

为什么要字节对齐?

为了快速准确的访问,若没有字节对齐则会出现多次访问浪费时间。

举例说明(定义一个char 和 int型数据不按照字节对齐存储的情况需要多次访问)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/28777.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

珂朵莉树/颜色段均摊

名称简介 珂朵莉树(Chtholly Tree),又名老司机树 ODT(Old Driver Tree)。起源自 CF896C。 注意,这种想法的本质是基于数据随机的「颜色段均摊」,而不是一种数据结构,下文介绍的操作是这种想法的具体实现方法。 前置知识 会用 STL 的 set 就行。 核心思想 把值相同的区间…

1、数仓基础

1、数据仓库的概念 数据仓库(英语:Data Warehouse,简称数仓、DW),是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。数据仓库本身并不“生产”任何数据,其数据来源于不同外部系统;…

第七章——程序设计语言基础知识

基本概念,编译与解释,文法,有限自动机。正规式,表达式,传值与引用(传值),各种程序语言特点第七章——程序设计语言基础知识 7.1 基本概念 7.1.1 低级语言和高级语言 通常称机器语言和汇编语言为低级语言。机器语言是指用0、1字符串组成的机器指令序列,是最基本的计算机语…

软件设计师:软件工程基础知识

能力模型 CMM(能力成熟度模型)初始级:没明确定义 可重复级:建立基本的项目管理过程和实践 已定义级:文档化、标准化 已管理级:管理层制定了软件过程和产品质量的详细度量标准 优化级:不断持续地改进CMMI(能力成熟度模型集成)基本不考已执行的:可标识的输入转换为可标…

TextMeshPro - 富文本标签

初始文本 粗体<b></b> 斜体<i></i> 颜色<#ff0000></color> 大小<size></size> <size=60%>中</size><size=1.2em>中</size> 下划线<u></u> 删除线<s></s> 上标<sup…

Linux 中 2>1 解释

在Linux系统中: 0 表示标准输入; 1表示标准输出; 2表示标准错误输出; 2>&1 表示将标准错误输出重定向到标准输入; 举一个例子: a、不将标准错误输出 重定向到标准输入中。[root@PC1 gffread-0.12.7.Linux_x86_64]# xxx ## 在终端随机输入一个命…

OpenResty

原文:https://www.cnblogs.com/liekkas01/p/12757576.htmlcosocket 是各种 lua-resty-* 非阻塞库的基础,没 有 cosocket,开发者就无法用 Lua 来快速连接各种外部的网络服务。 在早期的 OpenResty 版本中,如果想要去与 Redis、memcached 这些服务交互的话,需要使用 redis2-…

cannot execute binary file

001、问题,调用一个二进制文件,出现如下的报错[root@PC1 gffread-0.12.7.OSX_x86_64]# ls gffread [root@PC1 gffread-0.12.7.OSX_x86_64]# ./gffread -bash: ./gffread: cannot execute binary file 002、问题原因 出现如上报错的原因通常是: 该错误发生时,通常是在尝试执…