class { ... }不是010101的數據盒,人寫的(叫cpp源碼)到編譯器編譯的(非可控,由微軟決定編譯)
class { ... }想成一個實體盒子認為大括號裡寫的類型、變數和函數最後都要一起塞進每個物件內部的 0/1 裡。--這是錯誤的類別宣告是編譯器閱讀的一份規則文件不是一整塊會原樣存在於執行期記憶體中的資料。Epic 也把 class 描述成建立 ObjectActor 的模板類別標頭裡是「宣告」函數與屬性不是說每個物件都攜帶一份函數。(Epic Games Developers)看這個struct FVectorLike { using Scalar float; float X; float Y; float Z; float LengthSquared() const { return X * X Y * Y Z * Z; } };你在源碼中看到它們都寫在同一對{}裡但編譯後會被分流到完全不同的地方。FVectorLike 的宣告 ├─ using Scalar float │ └─ 只給編譯器建立一個類型別名 │ └─ FVectorLike 物件裡不佔空間 │ ├─ float X, Y, Z │ └─ 決定每個物件的資料布局 │ └─ 每個 FVectorLike 物件真正擁有三個 float │ └─ LengthSquared() └─ 編譯成一份機器指令 └─ 所有 FVectorLike 物件共同使用一個物件真正存了什麼例如FVectorLike A; FVectorLike B;執行期可以近似理解成A 的記憶體 ├─ X4 bytes ├─ Y4 bytes └─ Z4 bytes B 的記憶體 ├─ X4 bytes ├─ Y4 bytes └─ Z4 bytes在典型 Windows C 實作中它們通常各自是 12 bytes實際布局仍由型別、對齊及編譯器 ABI 決定。C 所謂 object layout主要就是描述資料成員如何排列在物件記憶體裡。(Microsoft Learn)它們不會變成A ├─ X ├─ Y ├─ Z ├─ Scalar 類型資訊 └─ LengthSquared 函數的全部機器碼函數沒有複製進 A也沒有複製進 B。!!!那A.LengthSquared()怎麼知道操作 A這是關鍵。你寫float Result A.LengthSquared();概念上編譯器可以把它理解成float Result FVectorLike_LengthSquared(A);也就是函數只有一份但呼叫時偷偷多傳入this A;因此原來的return X * X Y * Y Z * Z;概念上等於return this-X * this-X this-Y * this-Y this-Z * this-Z;C 的非靜態成員函數具有隱含的this指標指向目前正在被操作的物件。(Microsoft Learn)所以A.LengthSquared(); B.LengthSquared();使用的是同一份函數機器碼區別只在傳進去的物件地址呼叫 A.LengthSquared() └─ this A 的地址 呼叫 B.LengthSquared() └─ this B 的地址這就是「資料屬於每個物件行為由所有物件共用」。「類別裡可以存類型」也不是把類型塞進物件例如struct FContainer { using ValueType float; struct FIterator { int Index; }; ValueType Value; };這裡FContainer ├─ ValueType │ └─ 一個作用域內的類型名稱 │ ├─ FIterator │ └─ 另一個類型的宣告 │ └─ Value └─ 真正的資料成員你可以寫FContainer::ValueType Number; FContainer::FIterator Iterator;FContainer::在這裡更像一個名稱作用域FContainer └─ 裡面有哪些名稱 ├─ ValueType ├─ FIterator └─ Value巢狀類型本身不會增加FContainer物件大小。只有你真的寫struct FContainer { FIterator Iterator; };這時Iterator才是物件資料才會佔記憶體。因此要區分struct FIterator {}; // 宣告一種類型 FIterator Iterator; // 放置一個該類型的物件第一行只是讓編譯器知道「有這種形狀」。第二行才是真的要求按照FIterator的布局給每個FContainer實例留出一塊記憶體。最底層的 0/1 到底怎麼區分資料、類型和函數0 和 1 本身沒有「這是 float」「這是函數」的天然標籤。同一串 bits01000000 01001001 00001111 11011011只有在不同解讀規則下才可能被理解成└─ 當 float 解讀 └─ 一個浮點數 └─ 當 int32 解讀 └─ 一個整數 └─ 當機器指令的一部分解讀 └─ 某些 CPU opcode / operand意義來自「誰在解讀」以及「按什麼規則解讀」。完整鏈路是C 源碼文字 └─ 編譯器解析 ├─ 類型宣告 │ └─ 用於檢查尺寸、成員偏移、呼叫是否合法 │ ├─ 資料成員 │ └─ 形成物件的記憶體布局 │ └─ 函數 └─ 編譯成 CPU 機器指令 可執行檔 ├─ Code / .text │ └─ 函數的機器指令 │ ├─ Data │ └─ 全域與靜態資料 │ └─ 編譯器與連結器資訊 └─ 符號、重定位、除錯資訊等 執行時 ├─ CPU 指令指標指向 Code │ └─ CPU 把那些 bytes 當指令執行 │ └─ Load / Store 指令指向物件記憶體 └─ CPU 把那些 bytes 當資料讀寫不是 bits 自己聲稱「我是函數」。而是CPU 從指令指標位置取 bytes └─ 按指令集解碼 └─ 它們成為函數指令 CPU 執行讀取 float 的指令 └─ 從某地址取 4 bytes └─ 按浮點格式使用!!!函數如果是虛函數,則以base類裡的所有Virtual函數給這個類湊成表例如struct Base { virtual void F(); virtual void G(); }; struct ChildA : Base { void F() override; }; struct ChildB : Base { void G() override; };概念上的布局是Base 的表 ├─ slot 0 → Base::F └─ slot 1 → Base::G ChildA 的表 ├─ slot 0 → ChildA::F └─ slot 1 → Base::G ChildB 的表 ├─ slot 0 → Base::F └─ slot 1 → ChildB::G不是一張總表 ├─ Base::F ├─ ChildA::F ├─ ChildB::F ├─ Base::G ├─ ChildA::G └─ ChildB::G而是每個類型都有一套固定槽位槽位代表虛函數接口槽位裡放的是對這個具體類型而言該虛函數最終應該調用哪個實現。Microsoft 的資料也把 vtable 描述為函數指標構成的表虛呼叫會從固定 offset 的槽位讀出函數地址再調用。(Microsoft Learn)所以class { ... }究竟是什麼不要再把它理解成「一個裡面裝了資料和函數的盒子」。更準確是class / struct ├─ 一個名稱作用域 │ ├─ 可放類型名稱 │ ├─ 可放函數名稱 │ └─ 可放變數名稱 │ ├─ 一份物件布局規則 │ └─ 非 static 資料成員決定物件裡有哪些 bytes │ ├─ 一組可作用於該物件的函數 │ └─ 通過 this 指標找到具體物件 │ └─ 一套存取與型別檢查規則 ├─ public ├─ protected └─ private它不是單一物理實體而是 C 把幾種相關規則收束到同一個名字下。最終可以壓成一句類別大括號裡混合的是「宣告」不是同一種執行期資料編譯器會把類型規則留在編譯期把資料成員變成物件布局把函數變成共用機器碼再用this把函數接到具體物件。它們根本沒有作為同一坨 0/1 被塞進物件只是在源碼層被放進同一個語義作用域。

相关新闻

Unity游戏开发实战:从《一方净土》源码学习架构设计与性能优化

Unity游戏开发实战:从《一方净土》源码学习架构设计与性能优化

1. 项目概述:从“一方净土”源码看Unity实战开发最近在社区里看到不少朋友对《一方净土》这个独立游戏的源码很感兴趣,也常有人问起如何通过分析一个成熟项目的源码来提升自己的Unity开发能力。正好,我手头有这份源码,也花了不少时…

2026/10/11 11:24:52 阅读更多 →
Windows下绕过UnityHub直接启动Unity项目的三种实战方法

Windows下绕过UnityHub直接启动Unity项目的三种实战方法

1. 项目概述:为什么我们需要绕过UnityHub?作为一名在游戏开发一线摸爬滚打了十多年的老鸟,我敢说,UnityHub绝对是让无数开发者又爱又恨的存在。爱它,是因为它提供了一个统一的项目管理和版本切换入口;恨它&…

2026/10/9 1:57:19 阅读更多 →
MySQL触发器实战指南:从核心原理到性能优化

MySQL触发器实战指南:从核心原理到性能优化

1. 项目概述:为什么我们需要触发器?在数据库的世界里,数据就像一座不断运转的精密工厂。我们通过SQL语句(增删改查)来操作数据,这就像是工厂里的工人手动搬运、加工零件。但想象一下,如果每次往…

2026/10/6 1:11:20 阅读更多 →

最新新闻

Python成绩统计作业复盘:从平行列表到字典与函数重构

Python成绩统计作业复盘:从平行列表到字典与函数重构

第二次作业发下来的那天,课程群里比平时安静了不少。第一次作业只要照着课堂示例把代码拼一拼,第二次题目一出,大家才发现要面对的是一整套流程:录入、存储、计算、排序、统计、输出。这道成绩统计题几乎在每个Python入门课程里都…

2026/10/12 5:52:28 阅读更多 →
前缀和进阶:哈希表、二维前缀和与树状数组

前缀和进阶:哈希表、二维前缀和与树状数组

刷LeetCode刷到一定量之后,你会发现前缀和就像一把“万能钥匙”:它能把区间求和从O(n)压到O(1),也能配合哈希表把子数组统计问题从O(n)压到O(n)。在上一个专题里,我详细讲过最基础的一维前缀和构造、区域和检索、中心下标这类直接…

2026/10/12 5:52:28 阅读更多 →
SpringBoot智能推荐卫生健康系统毕设实战:内容推荐算法实现

SpringBoot智能推荐卫生健康系统毕设实战:内容推荐算法实现

1. 项目概述1.1 这个毕设到底在做什么"基于springboot智能推荐的卫生健康系统的设计与实现",说人话就是:做一个能根据用户的身体状况、生活习惯和健康目标,主动给出个性化健康建议的Web平台。它不是一个简单的健康资讯网站&#xf…

2026/10/12 5:52:28 阅读更多 →
JAVA_HOME环境变量配置与排查:从报错到避坑全攻略

JAVA_HOME环境变量配置与排查:从报错到避坑全攻略

做了这么多年Java开发,几乎每个季度都得处理一次“JAVA_HOME环境变量”的幺蛾子。新同事入职第一件事是配JDK,老同事换项目第一件事是切版本,可翻来覆去出问题的,还是那个看起来人畜无害的JAVA_HOME。你可能也见过这样的报错&…

2026/10/12 5:52:28 阅读更多 →
3关键字B+树构建全解析:从分裂上提到删除合并

3关键字B+树构建全解析:从分裂上提到删除合并

如果你能在纸上从零构建一棵最多只装 3 个关键字的 B 树,那基本上就掌握了 B 树八成以上的难点。这是我当年准备面试时一个学长告诉我的,我照做之后发现确实如此——复杂的 m 阶 B 树,无非是把这里的“3”换成“几百”,分裂、上提…

2026/10/12 5:52:28 阅读更多 →
大模型推理优化实践:从KV Cache到语义缓存的三层缓存架构

大模型推理优化实践:从KV Cache到语义缓存的三层缓存架构

上个月排一个线上问题,我们的对外AI问答服务上线第三周,GPU没有扩容,但模型调用账单涨了快三倍。查了一圈下来最扎眼的还不是成本:平均每天十几万请求里差不多一半是“语义重复”——“附近有什么川菜馆”“川菜馆哪家好”“推荐一…

2026/10/12 5:51:27 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →