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

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

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

相关推荐
hie9889411 分钟前
C语言中的输入输出函数:构建程序交互的基石
c
TT哇1 小时前
【Java EE初阶】计算机是如何⼯作的
java·redis·java-ee
pipip.1 小时前
UDP————套接字socket
linux·网络·c++·网络协议·udp
朱包林4 小时前
day45-nginx复杂跳转与https
linux·运维·服务器·网络·云计算
孙克旭_4 小时前
day045-nginx跳转功能补充与https
linux·运维·nginx·https
孞㐑¥6 小时前
Linux之Socket 编程 UDP
linux·服务器·c++·经验分享·笔记·网络协议·udp
Fireworkitte8 小时前
Apache POI 详解 - Java 操作 Excel/Word/PPT
java·apache·excel
weixin-a153003083168 小时前
【playwright篇】教程(十七)[html元素知识]
java·前端·html
DCTANT8 小时前
【原创】国产化适配-全量迁移MySQL数据到OpenGauss数据库
java·数据库·spring boot·mysql·opengauss
Touper.8 小时前
SpringBoot -- 自动配置原理
java·spring boot·后端