如何从底层优化memmove

news2025/1/13 10:16:10

如何从底层优化memmove

先实现memmove:

  • 如果没有重叠,可以按任何方向拷贝
  • 如果有重叠,先拷贝重叠位置,再考虑是前重叠还是后重叠

优化策略:

  • 拷贝数据的时候应该根据寄存器的大小来设计拷贝单位,注意数据区域可能不是寄存器大小的整数倍
  • (熟悉体系结构的同学可以考虑)使用SIMD指令

ABI兼容问题

不同版本的gcc编译处理的库文件能混用吗?

不一定能。

参考
作者

chivstyle ABI问题

ABI常识

有相当一部分程序员弄不清楚API和ABI的差别,甚至根本就没说过ABI。这并不是ABI不重要,而是在小型开发团队中ABI问题不容易遇到,当团队扩大,开发程序使用的组件增多,这个问题就会变得严重。我们倾向于从头说起,就当是科普了。

API和ABI

API,Application Programming Interface

ABI,Application Binary Interface

从名字上就可以看出,API是面向编程人员的,是面向人的;而ABI,编程人员是不容易直接看到的,但编程人员的行为可以直接影响到ABI,简单来说,ABI是面向编译器的。举个简单的例子

void print(int tag1, int tag2, int tag3)
{
    printf("%d\n", tag1 + tag2 + tag3);
}

这段程序提供一个API,函数原型为

void print(int, int, int)

对于开发人员而言,到这里已经不需要再深入了。对于编译器而言,却有很多工作要考虑,例如

  • 参数计算的顺序

  • 参数入栈的顺序

  • 寄存器传参如何安排
    这些工作发生在二进制层面,因此就称作ABI,意味着二进制层面的接口规范。编译器如何处理这些问题和处理器密切相关,一般不足以引起什么问题,更严重的问题发生在语言和编译器之间,例如:

  • 异常的处理

  • STL代码的例化

  • 虚函数的实现

  • 结构体的对齐

ABI不兼容

既然知道了什么是ABI,那么就可以考虑ABI的兼容问题了。

假设有一个程序A,依赖一个库libA中的某个函数,假设为

void __cdecl A_calc(int s1, int s2);

A由程序员John维护,libA由程序员CHIV维护,某一天CHIV就突然升级了一下

void __cdecl A_calc(int s1, int s2, int s3);

John习惯性的更新了libA,这就出现了问题,这既是典型的ABI不兼容问题。有人可能会说了,john重新编译一下不就能发现问题吗?显然,是的。如果随随便便更新某个lib,john就得重新编译程序,那么请问把软件分模块的意义是不是打了个大折扣。一个很大的程序A,居然因为一个小小的组件libA,就大动干戈重新编译一下,这不就是因小失大吗?

当使用的开发语言成为C++之后,ABI的问题就更严重了。主要体现在STL和虚函数上,试想一下,你的开发伙伴给你的头文件里一大堆的STD,你是不是有点发疯,你们的编译器都不一样好吗?过来一大堆C++11的代码,你连编译过去都不可能,VS2013支持的C++11连继承构造也没实现你信不?

既然如此,那大家都是用支持C++11的编译器行吗?还是不行,因为C++11没有规定ABI,编译器如何实现谁也不知道?于是你接口里的什么容器之类的就只能等着崩溃,VC自家的编译器都不能纵向兼容,不同厂家的还能指望吗?

是不是没有办法了?也不是,你只要给你的合作伙伴提供源代码就行,让他直接从源代码编译,无限期增加他的Build工作量,让他996,然后某一天他上班的时候也许会带把枪(这个梗能get到吗)什么的?

说完了STL,然后再说一下虚函数。

class U2B {
public:
    U2B() {}
    
    void Start();
    virtual void Stop();
    virtual void OnCompleted();
    void Shutdown();
};

这是CHIV给你的接口,看着是不是很感人?但是没过多久,CHIV就增加了一个方法

class U2B {
public:
    U2B() {}
    virtual void Log();
    void Start();
    virtual void Stop();
    virtual void OnCompleted();
    void Shutdown();
};

就当所有编译器都一样吧,把所有的虚函数安排在类实例的起始位置,那里就放了一张虚函数表,表中的函数是个什么顺序?当然是虚函数出现的顺序。升级后,很明显表中的第一项变了,那么对Stop的调用,就指向了Log,这不就错了吗?关键是这个函数也能正常执行,于是John根本就找不到问题。更为要命的是,CHIV提供的这个lib是以组件形式管理的,你就算重新编译一下也找不到问题,john的妈妈每天都得喊他回去吃饭。这个ABI不兼容不崩溃、不报错,程序就是执行不正常。或者这个功能干脆就不常用,客户偶尔碰到一次,干脆一票否决了。

ABI兼容的措施
首先说结论,没有根本的办法防止ABI不兼容的问题。只能通过规范管理、增强安全编程的意识、提高对与程序的运行原理的认识才能降低这种概率,从编程技巧上,前辈们已经总结出了一些,这一节主要就介绍Pimpl方法。

在开发中不使用STL或者不使用虚函数确实能避免不少ABI问题,如果这样的话,还是用C++干啥。所以前辈们就想出了Pimpl方法,它的中心思想就是,给合作伙伴的接口里面没有STL,也没有虚函数,所有能引起ABI兼容问题的特征都被封死在库的本身范围之内。这需要用到C++的前置声明,还是举例说明。

class U2BImpl;
class U2B {
public:
    U2B() {}
    void Start();
    void Stop();
    void OnCompleted();
    void Shutdown();
private:
    U2BImpl* mImpl;
};

这就是给合作伙伴的接口,U2BImpl是真正的实现,U2B是这个实现的封装,U2BImpl并不需要用户直接访问,从而隔离了ABI不兼容的问题。

补充阅读内容

[1] https://community.kde.org/Policies/Binary_Compatibility_Issues_With_C%2B%2B

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

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

相关文章

怎么快速搭建Vue+Vite项目?

快速搭建VueVite项目的步骤如下: 1.随便创建一个文件夹,用来放项目。我这里创建的文件夹名称是my-vite。 2.在当前目录的路径显示框输入cmd,快速打开cmd命令窗口 3.输入以下命令查询电脑是否已经安装了node.js,此时需注意node版本需要&g…

Nginx的讲解

Nginx的讲解 关于Nginx编译安装Nginx服务1.关闭防火墙,将安装nginx所需软件包传到/opt目录下2.安装依赖包3.创建运用用户、组4.编译安装Nginx5、检查、启动、重启、停止 nginx服务6.添加 Nginx系统服务 Nginx服务的主配置文件 nginx.conf1.全局配置2.I/O 事件配置3.…

【笔试强训编程题】Day3.(字符串中找出连续最长的数字串 69385)和(数组中出现次数超过一半的数字 23271)

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训编程题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!! 文章目录…

【shiro】shiro整合JWT——3.执行流程

前言 shiro整合JWT系列,主要记录核心思路–如何在shiroredis整合JWTToken。 上一篇中,主要讲如何在shiro框架中配置Jwt,以及token执行的流程。 该篇主要梳理整个代码的执行流程。 ps:本文主要以记录核心思路为主,以下…

JavaWeb14(ajax02判断账号是否存在JSON介绍AJAX+JSON字符串和对象之间的转换JSON实现自动补全)

目录 一.AJAX实现即时检查用户名是否存在 1.1 效果预览 1.2 代码实现 ①html代码 ②ajax请求 ③底层代码 2.JSON概述. 2.1何为JSON. 2.2为什么需要JSON. 2.3JSON格式介绍. 2.3.1JSON对象格式. 2.3.2JSON数组格式. 2.3.3JSON对象数组格式. 3.JSON字符串的解析. 3.1…

springboot启动过程原理分析

前言 现在绝大多数java项目都上了Springboot框架, 因此深入理解Springboot框架的运行原理,能帮助我们更好的在Springboot框架下进行业务开发,同时能学习框架中优秀的设计思想, 本文主要是通过对Springboot源码的分析, 来理解整个springboot项目的启动流程. 因为Springboot不同…

Spring:Spring框架_事务传播和隔离级别 ④

一、事务和四大特性 事务:指数据库的一个执行操作单元 事务的四个特性(ACID) 1.1 原子性 原子性(Atomicity):操作这些指令时,要么全部执行成功,要么全部不执行。只要…

JUC 学习笔记

JUC 学习笔记 本文为笔者对 JUC 的学习记录,主要参考了尚硅谷的 JUC 教程 文章目录 JUC 学习笔记1. JUC 概述什么是 JUC?线程和进程:进程的状态:wait 和 sleep:并发和并行:管程:用户线程和守护…

Python numpy - 数组的向量化运算

目录 一 函数numpy.where 二 数组统计方法 1 基础数组统计方法 2 布尔值数组的方法 三 排序 1 函数sort 2 函数np.unique 向量化:利用数组表达式来替代显式循环的方法 一 函数numpy.where 条件逻辑函数 where(condition, x, y) condition为条件,当满足条件…

有限状态机器测试(过渡游览法)

有限状态机器测试(过渡游览法) 测试相关概念—故障类型 行为由转换定义。 故障分为三种类型: 输出错误Output faults:错误的输出是由转换产生的。 状态转移错误State transfer faults:转移到错误的状态。 额外的状态Extra states&#xff08…

医院检验科检验系统(LIS)源码:临检、生化、免疫、微生物

一、检验科检验系统 (LIS)概述:对接HIS,医生工作站能够方便、及时的查阅患者检验报告。 二、检验科检验系统 (LIS)主要功能描述: 1.质控品管理: 医院设备质控(编码、设…

数据结构入门7-2(散列表)

注 本笔记参考:《数据结构(C语言版)(第2版)》 散列表的基本概念 像基于线性表、数表的查找方式,往往都是以关键字的比较为基础的。这种比较方式在遇到结点数量很多的情况时就会暴露其的弊端:需要…

vue3-实战-03-管理后台路由分析搭建和登录模块开发

1-路由的搭建 先分析模块,搭建一些基础的路由信息,我们分析需要登录页面路由,登录成功后展示数据路由,404页面路由,以及我们输入错误的路径的我们需要重定向到404路由。配置好相关路由之后,我们需要在入口文…

基于 ESP32-H2 构建高性价比的安全物联网设备

如今,人们对网联设备安全性的认识和关注不断增加。在欧盟《网络弹性法案》也即将生效的,为网联设备增加硬件层面的安全功能非常重要。 乐鑫 ESP32-H2 致力于为所有开发者提供高性价比的安全解决方案,这款芯片经过专门设计以集成多种安全功能…

【java】java访问https并验证账号密码

java访问https,获取页面或者数据时,需要证书和账号密码的验证。 一 获取CRT证书 获取网站的证书,拿到证书后可能是crt格式,可以使用下面的命令转为p12格式 openssl pkcs12 -export -in Mycert.crt -inkey Mykey.key -out Mycer…

0基础学习VR全景平台篇第35篇:场景功能-细节

本期为大家带来蛙色VR平台,场景管理—细节功能操作。 功能位置示意 一、本功能将用在哪里? 细节功能,用于展示VR漫游作、大像素、高清矩阵作品中细微不容易发现,但却又比较有亮点或者能起到关键作用的画面。 通过在全景图中添加…

javaWeb ssh课程资源网站myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh课程资源网站系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

字节的测试面试题,你觉得很难吗?不是有手就行....

年前的时候,我的一个粉丝跟我说,他在面试美团的自动化测试岗的时候,不幸挂掉了。 越想越可惜,回想面试经过,好好总结了几个点,发现面试没过的主要原因是在几个关键的问题没有给到面试官想要的答案 字节的…

6-HEX, SE,引物荧光标记试剂,胺反应性琥珀酰亚胺酯,广泛用于nucleic acid测序和相关研究

6-HEX, SE | 6-HEX,SE [6-羧基-2,4,4,5,7,7-六氯荧光素,琥珀酰亚胺酯] |CAS:N/A | 纯度:95% (文章资料汇总来源于:陕西新研博美生物科技有限公司小编MISSwu)​ 结构…

Android Cannot resolve symbol 找不到资源解决方案

一、介绍 在android开发中,我们经常会发现依赖了系统提供的库,但是无法引用,或者找不到, Cannot resolve symbol style/Theme.AppCompat.NoActionBar ,报红。这些最经典的无法加载。 出现这个原因并不是你项目的原因&…