编程语言支持中文变量吗?三字符组是什么来源?为什么结构体要考虑对齐?如何确定语言使用的地址是不是物理地址?用户态应用程序如何获取变量的物理地址?

编程语言支持中文变量吗?

早期编程语言因为字符集限制,大部分编程语言都只支持ASCII码。随着字符集不断扩展,系统内存足够大,编程语言限制字符集没有什么意义了。目前大部分主流编程语言都支持中文字符集,可以用中文命名变量。例如 int 我 = 1;

一些编程语言,也可以用一些特殊符号,比如Swift:

let 🐶🐮 = "dogcow"

print(🐶🐮)

三字符组是什么来源?

早期计算机键盘,有的并不支持全部的ASCII码。例如字符|, 就需要用已有的按键代表,即三字符组的来源。例如printf("??!")可以输出 | . 即??!三个字符代替|, 当然,现代大部分键盘都支持|字符,即不需要特别用三字符组来代替。注意,VS需要开启/Zc:trigraphs才会支持三字符组。

早期的C/C++均支持三字符组,C++17取消了三字符组。

为什么结构体要考虑对齐?

硬件访问本身有对齐的要求。以intel 32位处理器为例,每次数据总线访问32位数据,只有以4字节对齐才符合硬件访问行为。如不对齐,就会出现CPU多次访问的问题。

尽管编译器或硬件有对齐的需求,有时也不能要对齐,比如一些标准会规定数据包的格式,数据包并没有对齐的要求。这种情况下,必须强制编译器不要对齐。

如何确定语言使用的地址是不是物理地址?

一种最简单的原则就是,确认代码所处的运行环境是否有开启虚拟地址。比如在Kernel里面,一般开启VM后,程序默认使用和申请的地址均是虚拟地址,除非特别指定申请物理地址或转换。Bootloader根据所处的阶段,可能BL1用物理地址,进BL2开启VM,总之根据特定情况考虑。一般而言,用户态应用程序使用的均是虚拟地址。

用户态应用程序如何获取变量的物理地址?

以Linux为例,可以使用/proc/self/pagemap节点从虚拟地址转换成物理地址。以C/C++语言为例,用取地址符&获取变量的地址,获取的都是虚拟地址。如编译器没有将变量优化到寄存器或立即数,变量一定是虚拟地址,而这个过程编译器并不需要特别参与,只是按逻辑翻译成取地址的汇编指令,链接器复杂将可能产生重定位的变量安排在合适的地址。操作系统加载应用程序时,会将指令或数据放在正确的虚拟地址上。


若文章对您有帮助,欢迎关注。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

相关推荐
Discipline~Hai几秒前
Linux应用软件编程04-线程
linux·服务器·c语言·开发语言·linux应用软件编程
星星.722几秒前
【图论】最小生成树|Prim+Kruskal算法
数据结构·c++·算法·图论
charlie1145141915 分钟前
Cinux · musl 静态移植:对齐 Linux ABI、铺初始栈,以及一个被 SMAP 拦下的潜伏 bug
linux·开发语言·c++·操作系统·开源项目
AI人工智能+电脑小能手14 分钟前
大白话说Java设计模式-43-访问者模式(源码剖析篇)
java·设计模式·访问者模式·源码分析·elementvisitor·asm classvisitor·spring spel
_Narcissus_15 分钟前
单调栈笔记及例题详解
数据结构·c++·笔记·算法·力扣·单调栈·洛谷
流浪00120 分钟前
C/C++后端筑基系列(二):C++ 从基础到进阶
开发语言·c++
kyle~22 分钟前
x86 汇编LOCK前缀 --- 硬件架构向软件提供的核心同步原语
汇编·c++·性能优化·硬件架构·实时系统
Escalating_xu2 小时前
【C++入门基础(下)】默认参数、函数重载、引用、inline 与 nullptr
android·c++·redis
艾莉丝努力练剑2 小时前
【AI大模型接入SDK】Provider分析与实现
c++·人工智能·学习·面试·大模型·llm