相关疑难解决方法(0)

什么是应用程序二进制接口(ABI)?

我从未明白ABI是什么.请不要指向维基百科的文章.如果我能理解它,我就不会在这里张贴这么长的帖子.

这是我对不同界面的看法:

电视遥控器是用户和电视之间的接口.它是一个现有实体,但本身无用(不提供任何功能).遥控器上每个按钮的所有功能都在电视机中实现.

接口:它是间"现有实体"层 functionalityconsumer的该功能.接口本身不起作用.它只是调用后面的功能.

现在取决于用户是谁,有不同类型的接口.

命令行界面(CLI)命令是现有实体,消费者是用户和功能所在.

functionality: 我的软件功能解决了我们描述这个界面的一些目的.

existing entities: 命令

consumer: 用户

图形用户界面(GUI)窗口,按钮等是现有实体,消费者再次是用户和功能所在.

functionality: 我的软件功能解决了我们描述这个界面的一些问题.

existing entities: 窗口,按钮等..

consumer: 用户

应用程序编程接口(API)函数(或更正确的)接口(在基于接口的编程中)是现有实体,这里的消费者是另一个程序而不是用户,并且该层后面的功能也是如此.

functionality: 我的软件功能解决了我们描述这个界面的一些问题.

existing entities: 函数,接口(函数数组).

consumer: 另一个程序/应用程序

应用程序二进制接口(ABI)这是我的问题开始的地方.

functionality: ???

existing entities: ???

consumer: ???

  • 我用不同的语言编写了软件并提供了不同类型的接口(CLI,GUI和API),但我不确定我是否提供过任何ABI.

维基百科说:

ABI涵盖了诸如此类的详细信息

  • 数据类型,大小和对齐方式;
  • 调用约定,它控制函数参数的传递方式并返回检索的值;
  • 系统调用号码以及应用程序应如何向操作系统进行系统调用;

其他ABI标准化细节,如

  • C++名称错误,
  • 异常传播,和
  • 在同一平台上调用编译器之间的约定,但不需要跨平台兼容性.
  • 谁需要这些细节?请不要说操作系统.我知道汇编编程.我知道链接和加载是如何工作的.我确切地知道里面发生了什么.

  • 为什么C++名称输入?我以为我们正在谈二进制.语言为什么会进来?

无论如何,我已经下载了[PDF] System V Application Binary Interface Edition 4.1(1997-03-18),看看它究竟包含了什么.好吧,大部分都没有任何意义.

  • 为什么它包含两章(第4和第5章)来描述ELF文件格式?实际上,这些是该规范中仅有的两个重要章节.其余章节是"处理器特定的".无论如何,我认为这是一个完全不同的话题.请不要说ELF文件格式规范 ABI.根据定义,它不符合接口的条件.

  • 我知道,因为我们谈论的水平很低,所以必须非常具体.但我不确定它是如何"指令集架构(ISA)"具体的?

  • 我在哪里可以找到Microsoft Windows的ABI?

所以,这些是困扰我的主要问题.

compiler-construction api binary operating-system abi

444
推荐指数
11
解决办法
10万
查看次数

标准委员会关心的异域架构

我知道C和C++标准留下了语言实现的许多方面 - 仅仅因为如果存在具有其他特征的体系结构,那么为它编写符合标准的编译器是非常困难或不可能的.

我知道40年前任何电脑都有自己独特的规格.但是,我不知道今天使用的任何架构:

  • CHAR_BIT != 8
  • signed 不是两个补充(我听说Java有这个问题).
  • 浮点不符合IEEE 754(编辑:我的意思是"不是IEEE 754二进制编码").

我问的原因是我经常向人们解释C++不强制要求任何其他低级方面如固定大小的类型.这很好,因为与其他语言不同,它使你的代码在正确使用时可以移植(编辑:因为它可以移植到更多架构而不需要模拟机器的低级方面,例如符号+幅度架构上的二进制补码算法) .但我感到很难过,我自己也无法指出任何特定的架构.

所以问题是:哪些架构具有上述属性?

uint*_ts是可选的.

c c++ architecture

149
推荐指数
7
解决办法
1万
查看次数

为什么数据类型的大小会随着操作系统的变化而变化?

在一次采访中我问过这个问题,char在某些操作系统中大小为2个字节,但在某些操作系统中它是4个字节或不同.

为什么会这样?

为什么它与其他基本类型不同,例如int

c c++ size operating-system

5
推荐指数
2
解决办法
1697
查看次数

C++ 二进制写入/读取 32 位到/从 64 位

如果您有一个二进制输出流,并将整数写入 32 位 Windows 计算机上的文件。那么您是否能够在 64 位 Windows 计算机上从同一个文件中读取相同的整数?

我的猜测是没有。由于 32 位计算机上的整数是 4 个字节,而 64 位计算机上的整数是 8 个字节。

下面的代码也可以工作,而无论操作系统、计算机体系结构和数据类型如何,文件都必须能够从 64 位和 32 位计算机读取和写入。如果不是,人们怎么能做到这一点,而文件必须是二进制形式。

写作

std::ofstream ofs("example.bin", std::ios::binary);

int i = 128;
ofs.write((char*) (&i), sizeof(i));

ofs.close();
Run Code Online (Sandbox Code Playgroud)

std::ifstream ifs("example.bin", std::ios::binary);

int i = 0;
ifs.read((char*) (&i), sizeof(i));

ifs.close();
Run Code Online (Sandbox Code Playgroud)

c++ file-io file stream 32bit-64bit

5
推荐指数
1
解决办法
4621
查看次数

sizeof除了char以外的任何类型都有保证吗?

我知道在C++ sizeof(char)中保证是1,但它是唯一的情况还是有其他内置类型保证具有确切的大小?

特别是语言要求sizeof(bool) == 1还是sizeof(int) == 4要求,还是实施细节?

c++

1
推荐指数
1
解决办法
328
查看次数

使用sizeof而不是literal

每当我看到malloc别人的代码时,它通常使用sizeof(short)sizeof(double)等等来帮助定义要分配的内存大小.为什么他们不只是用这两个例子用2或替换那些表达式8

c c++

0
推荐指数
1
解决办法
123
查看次数