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

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

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

相关推荐
花嫁代二娃4 小时前
Linux:环境变量
linux
胚芽鞘6814 小时前
关于java项目中maven的理解
java·数据库·maven
岁忧5 小时前
(LeetCode 面试经典 150 题 ) 11. 盛最多水的容器 (贪心+双指针)
java·c++·算法·leetcode·面试·go
CJi0NG5 小时前
【自用】JavaSE--算法、正则表达式、异常
java
zwjapple5 小时前
shell学习从入门到精通
shell
Hellyc5 小时前
用户查询优惠券之缓存击穿
java·redis·缓存
今天又在摸鱼6 小时前
Maven
java·maven
老马啸西风6 小时前
maven 发布到中央仓库常用脚本-02
java·maven
代码的余温6 小时前
MyBatis集成Logback日志全攻略
java·tomcat·mybatis·logback
一只叫煤球的猫7 小时前
【🤣离谱整活】我写了一篇程序员掉进 Java 异世界的短篇小说
java·后端·程序员