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

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

早期编程语言因为字符集限制,大部分编程语言都只支持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等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

相关推荐
间彧17 小时前
SimpleDateFormat既然不推荐使用,为什么java 8+中不删除此类
java
间彧17 小时前
DateTimeFormatter相比SimpleDateFormat在性能上有何差异?
java
间彧17 小时前
为什么说SimpleDateFormat是经典的线程不安全类
java
MacroZheng17 小时前
横空出世!MyBatis-Plus 同款 ES ORM 框架,用起来够优雅!
java·后端·elasticsearch
用户03321266636718 小时前
Java 查找并替换 Excel 中的数据:详细教程
java
间彧18 小时前
ThreadLocal实现原理与应用实践
java
若水不如远方18 小时前
Netty的四种零拷贝机制:深入原理与实战指南
java·netty
感哥18 小时前
C++ STL 常用算法
c++
用户74936368484318 小时前
【开箱即用】一分钟使用java对接海外大模型gpt等对话模型,实现打字机效果
java