嵌入式面试常见问题(二)

news2024/10/6 9:20:04

1.malloc如何分配内存?

进行虚拟地址空间的分布:程序地址空间-》程序虚拟地址空间-》进程虚拟地址空间

内存布局:

进程虚拟地址空间和PCB(Process Control Block,进程控制块)进行串联 :

分配内存方式:

第一种:通过brk()系统调用从堆分配内存

第二种:通过mmap()系统调用在文件映射区分配内存

两种方式如何区分?

1.如果用户分配的内存小于128KB,则通过brk()申请内存;

2.如果用户分配的内存大于128KB,则通过mmap()申请内存;

3.不同的glibc当中定义的阈值是不一样的,但基本就是上面两种。

2.readelf和objdump区别

readelfobjdump都是用于分析可执行文件、共享库和目标文件的工具,但它们在显示的信息和使用方式上有一些区别。

  1. readelf

    • readelf是一个用于查看和分析可执行文件、共享库和目标文件的工具。
    • 它主要用于显示文件的结构信息,如节表、符号表、重定位表、动态链接信息等。
    • readelf提供了丰富的选项来显示不同类型的信息,如-s用于显示符号表,-S用于显示节表,-r用于显示重定位表等。
    • 它以一种较为详细的格式显示文件的信息,适合用于查看文件的结构和元数据。
  2. objdump

    • objdump是一个用于反汇编可执行文件、共享库和目标文件的工具。
    • 它可以显示文件的汇编代码,包括指令、符号、调试信息等。
    • objdump可以用于查看文件的汇编指令,以及对应的源代码(如果调试信息可用)。
    • 它提供了多种选项来控制显示的内容和格式,如-d用于显示反汇编代码,-t用于显示符号表,-S用于显示源代码等。
    • objdump更适合用于分析代码的执行流程、查看函数的汇编实现等。

总结:

  • readelf主要用于显示文件的结构信息,如节表、符号表、重定位表等,适合用于查看文件的结构和元数据。
  • objdump主要用于反汇编文件,显示汇编代码、符号、调试信息等,适合用于分析代码的执行流程和查看函数的汇编实现。

3.如何验证一个函数是否inline? 

        通过对可执行文件进行反汇编,查看汇编代码函数是否被展开。示例:

        一般来讲,判断对一个内联函数是否做展开,从程序员的角度出发,主要考虑如下因素。
                ● 函数体积小。
                ● 函数体内无指针赋值、递归、循环等语句。
                ● 调用频繁。
        当我们认为一个函数体积小,而且被大量频繁调用,应该做内联展开时,就可以使用static inline关键字修饰它。但编译器不一定会做内联展开,如果你想明确告诉编译器一定要展开,或者不展开,就可以使用noinline或always_inline对函数做一个属性声明

#include <stdio.h>

static inline __attribute__((always_inline)) int func(int a)
{
    return a + 1;
}
static inline void print_num(int a)
{
    printf("%d\n",a);
}
int main(void)
{
    int i;
    i = func(3);
    print_num(10);
    return 0;
}

        在这个程序中,我们分别定义两个内联函数:func()和print_num(),然后使用always_inline对func()函数进行属性声明。编译这个源文件,并对生成的可执行文件a.out做反汇编处理,其汇编代码如下。  

        通过反汇编代码可以看到,因为我们对func()函数作了always_inline属性声明,所以在编译过程中,在调用func()函数的地方,编译器会将func()函数在调用处直接展开。

        而对于print_num()函数,虽然我们对其做了内联声明,但编译器并没有对其做内联展开,而是把它当作一个普通函数对待。还有一个需要注意的细节是:当编译器对内联函数做展开处理时,会直接在调用处展开内联函数的代码,不再给func()函数本身生成单独的汇编代码。因为编译器在所有调用该函数的地方都做了内联展开,没必要再去生成单独的函数汇编指令。在这个例子中,我们发现编译器就没有给func()函数本身生成单独的汇编代码,编译器只给print_num()函数生成了独立的汇编代码。

内联函数为什么定义在头文件中?

        因为它是一个内联函数,可以像宏一样使用,任何想使用这个内联函数的源文件,都不必亲自再去定义一遍,直接包含这个头文件,即可像宏一样使用

内联函数为什么用static修饰? 

        因为我们使用inline定义的内联函数,编译器不一定会内联展开,那么当一个工程中多个文件都包含这个内联函数的定义时,编译时就有可能报重定义错误。而使用static关键字修饰,则可以将这个函数的作用域限制在各自的文件内,避免重定义错误的发生。 

4.函数的参数传递方式 

  1. 值传递(Pass by Value):这是最常见的参数传递方式。在这种方式中,函数接收的是实参的一个副本。因此,函数内部对参数的修改不会影响到实参。

  2. 引用传递(Pass by Reference):在这种方式中,函数接收的是实参的引用,也就是说,函数内部对参数的修改会直接影响到实参。这种方式在C++中常见,但C语言不支持。

  3. 指针传递(Pass by Pointer):这种方式类似于引用传递,但是使用的是指针。函数接收的是指向实参的指针,因此,函数内部对指针所指向的值的修改会影响到实参。这是C语言中实现"引用传递"的一种方式。

5. C语言和C++定义结构体变量的区别

        在C中定义一个结构体类型要用typedef,如下:

typedef struct Complex {
    int real;
    int image;
}Complex;

        那么,在说明Complex变量的时候可以这样写 Complex complex; 但是如果没有typedef就必须用 struct Complex complex; 来声明。这里的Complex实际上就是struct Complex的别名


  但在c++里很简单,直接

struct Complex {
    int real;
    int image;
};

        于是就定义了结构体类型Complex,声明变量时直接Complex complex

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

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

相关文章

微信小程序进阶——后台交互

目录 一、后台准备 1.1 pom.xml 1.2 配置数据源 1.3 整合mybatis 二、前后端交互 2.1 method1 2.2 method2 2.2.1 封装request 2.2.2 头部引用util 2.2.3 编写方法 2.2.4 展示效果 三、WXS的使用 3.1 会议状态 3.1.2 引入wxs 3.1.3 修改代码 3.1.4 展示效果 3…

计算机毕业设计 基于SpringBoot笔记记录分享网站的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Mysql 中的性能调优方法

Mysql 性能调优方法可以从四个方面来说&#xff0c;分别是&#xff1a; 表结构与索引 SQL 语句优化 Mysql 参数优化 硬件及系统配置 这四个方面的优化成本和优化效果是成反比的。 表结构和索引的优化 表结构和索引的优化&#xff0c;主要可以下面这些方面去优化&#xff1a; 分…

NewStarCTF 2023 公开赛道 WEEK2|WEB 游戏高手

app_v2.js就是游戏文件 右键“用调试器打开”&#xff1a; var gameScore 0; 就是当前分数&#xff0c; 打开控制台&#xff0c;输入 gameScore 1000000&#xff0c;回车 就可以得到flag

字节码进阶之ASM字节码操作类库详解

文章目录 0.前言1. 引言2. ASM简介3. 字节码基础知识回顾 4. ASM的核心概念5. ASM的基本用法5.1. 读取和分析字节码5.2. 修改和生成字节码 6. ASM的高级用法6.1. 字节码增强技术6.2. 自定义类加载器和类定义 7. 实例演示&#xff1a;使用ASM实现简单的字节码增强 字节码进阶之A…

代码随想录算法训练营第二十八天丨 回溯算法part04

491.递增子序列 思路 这个递增子序列比较像是取有序的子集。而且本题也要求不能有相同的递增子序列。 在90.子集II (opens new window)中是通过排序&#xff0c;再加一个标记数组来达到去重的目的。 而本题求自增子序列&#xff0c;是不能对原数组进行排序的&#xff0c;排…

前端工作方式要换了?HTMX简介:无需JavaScript的动态HTML

HTMX允许你使用扩展的HTML语法代替 JavaScript 来实现交互性。HTMX 在标记中直接为你提供HTTP 交互&#xff0c;并支持许多其他交互需求&#xff0c;无需求助于 JavaScript。这是一个有趣的想法&#xff0c;可能最终会影响到web前端的工作方式。让我们看看如何使用HTMX以及它的…

pytorch 入门 (三)案例一:mnist手写数字识别

本文为&#x1f517;小白入门Pytorch内部限免文章 &#x1f368; 本文为&#x1f517;小白入门Pytorch中的学习记录博客&#x1f366; 参考文章&#xff1a;【小白入门Pytorch】mnist手写数字识别&#x1f356; 原作者&#xff1a;K同学啊 目录 一、 前期准备1. 设置GPU2. 导入…

聊聊分布式架构09——分布式中的一致性协议

目录 01从集中式到分布式 系统特点 集中式特点 分布式特点 事务处理差异 02一致性协议与Paxos算法 2PC&#xff08;Two-Phase Commit&#xff09; 阶段一&#xff1a;提交事务请求 阶段二&#xff1a;执行事务提交 优缺点 3PC&#xff08;Three-Phase Commit&#x…

kubeadm初始化搭建cri-dockerd记录 containerd.io

07.尚硅谷_搭建K8s集群&#xff08;kubeadm方式&#xff09;-部署master节点_哔哩哔哩_bilibili 视频里的版本只有1.17而现在&#xff08;2023.10.20&#xff09;kubernetes最新版本是1.28&#xff0c;需要搭载cri-dockerd&#xff0c; 先去网站下载了对应的rpm包cri-dockerd…

计算机算法分析与设计(14)---贪心算法(会场安排问题和最优服务次序问题)

文章目录 一、会场安排问题1.1 问题描述1.2 思路分析1.3 例题分析1.4 代码编写 二、最优服务次序问题2.1 问题描述2.2 思路分析2.3 代码编写 一、会场安排问题 1.1 问题描述 假设在足够多的会场里安排一批活动&#xff0c;并希望使用尽可能少的会场。设计一个有效的贪心算法进…

kettle 导出Excel 日期信息为空bug

今天做个需求&#xff0c;跨库联表查询数据。导出为Excel &#xff0c;但是日期数据除了问题。日期yyyy/mm/dd hh:mm:ss 竟然是空的 。 解决办法&#xff1a; 一、&#xff08;网上给出最多的解决方案&#xff0c;但本人不实用。需要安装MySQL监听&#xff09; to_char(日期,…

Mojo——会燃的 AI 编程语言

点击链接了解详情 导语&#xff1a;本文简介 Mojo 的背景与特点&#xff0c;并分享如何通过腾讯云 Cloudstudio 的 WebIDE 和分享社区快速学习和上手 Mojo。 &#x1f525;&#x1f525;&#x1f525; 腾讯云 Cloud Studio 已开放 Mojo 应用模版。 什么是 Mojo Mojo 是基于 P…

CodeFormer和GFPGAN的本地部署与效果对比

CodeFormer和GFPGAN是两个图片人脸修复的开源程序&#xff0c;两个程序不相伯仲&#xff0c;效果都非常棒&#xff0c;在stable diffusion中这两个插件都有集成进去&#xff01;我们今天就将这两个程序的本地独立安装和使用方法记录一下&#xff01; CodeFormer github主页地址…

【前端】使用tesseract插件识别提取图片中的文字

前言 有时候项目需要识别证照信息&#xff0c;或者拍照搜索内容等。图片处理一般是后端处理比较好&#xff0c;不过前端也有相关插件处理&#xff0c;tesseract.js就是一种前端处理方案。 使用tesseract tesseract更多的语言模型&#xff1a;language配置 安装 Tesseract.…

react中JSX基础与useState的基本使用 + 评论显示删除需求案例

参考视频&#xff1a;https://www.bilibili.com/video/BV1ZB4y1Z7o8/?p3&spm_id_frompageDriver&vd_source5c584bd3b474d579d0bbbffdf0437c70 如果没有安装create-react-app需要先全局安装 命令&#xff1a;npm i -g create-react-app1.快速搭建开发环境 create-re…

国内有哪些做得好的企业协同办公软件

在当今信息化时代&#xff0c;企业协同办公软件成为了提升企业效率和推动协作的重要工具。国内市场涌现出许多优秀的企业协同办公软件&#xff0c;为企业提供了高效、便捷的协同办公解决方案。在本文中&#xff0c;我们将向大家介绍3款在国内好评如潮的企业协同办公软件&#x…

驱动day2 字符设备驱动 LED亮灯

可参考arm点灯C语言 cortex-A7核 点LED灯 &#xff08;附 汇编实现、使用C语言 循环实现、使用C语言 封装函数实现【重要、常用】&#xff09;-CSDN博客 1 应用程序 test.c #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <…

Adobe 推出 Photoshop Elements 2024 新版

&#x1f989; AI新闻 &#x1f680; Adobe 推出 Photoshop Elements 2024 新版 摘要:Adobe 最新发布 Photoshop Elements 2024 版本,新增引入 AI 功能,提供匹配颜色、创建照片卷、一键选择照片天空或背景等新功能,界面也进行了优化更新。本次发布重点加强了 AI 支持,简化复杂…

软考系列(系统架构师)- 2019年系统架构师软考案例分析考点

试题一 软件架构&#xff08;架构风格、质量属性&#xff09; 【问题1】&#xff08;13分&#xff09; 针对用户级别与折扣规则管理功能的架构设计问题&#xff0c;李工建议采用面向对象的架构风格&#xff0c;而王工则建议采用基于规则的架构风格。请指出该系统更适合采用哪种…