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

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

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

相关推荐
天天摸鱼的java工程师3 分钟前
Snowflake 雪花算法优缺点(Java老司机实战总结)
java·后端·面试
椰子今天很可爱18 分钟前
静态库和动态库
linux
Miraitowa_cheems31 分钟前
LeetCode算法日记 - Day 11: 寻找峰值、山脉数组的峰顶索引
java·算法·leetcode
檀越剑指大厂35 分钟前
【Linux系列】如何在 Linux 服务器上快速获取公网
linux·服务器·php
海梨花36 分钟前
【从零开始学习Redis】项目实战-黑马点评D2
java·数据库·redis·后端·缓存
共享家952736 分钟前
linux-高级IO(上)
java·linux·服务器
橘子郡12344 分钟前
观察者模式和发布订阅模式对比,Java示例
java
指针满天飞44 分钟前
Collections.synchronizedList是如何将List变为线程安全的
java·数据结构·list
Java技术小馆1 小时前
重构 Controller 的 7 个黄金法则
java·后端·面试
金銀銅鐵1 小时前
[Java] 以 IntStream 为例,浅析 Stream 的实现
java·后端