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/8/7 7:41:12 阅读更多 →
Windows下绕过UnityHub直接启动Unity项目的三种实战方法

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

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

2026/8/6 5:38:19 阅读更多 →
MySQL触发器实战指南:从核心原理到性能优化

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

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

2026/8/7 5:43:43 阅读更多 →

最新新闻

Unity URP渲染管线入门:从核心原理到项目实战配置指南

Unity URP渲染管线入门:从核心原理到项目实战配置指南

1. 项目概述:为什么URP是Unity开发者的新起点如果你最近打开Unity Hub准备新建一个项目,可能会发现一个明显的变化:在渲染管线的选择上,除了经典的“内置渲染管线”,一个名为“通用渲染管线”的选项被放在了更显眼的位…

2026/8/7 18:12:49 阅读更多 →
华硕笔记本终极轻量控制指南:5步掌握G-Helper高效管理

华硕笔记本终极轻量控制指南:5步掌握G-Helper高效管理

华硕笔记本终极轻量控制指南:5步掌握G-Helper高效管理 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Ex…

2026/8/7 18:12:49 阅读更多 →
Solidity By Example项目概览:一站式掌握以太坊智能合约开发核心

Solidity By Example项目概览:一站式掌握以太坊智能合约开发核心

Solidity By Example项目概览:一站式掌握以太坊智能合约开发核心 【免费下载链接】solidity-by-example.github.io Solidity By Example 项目地址: https://gitcode.com/gh_mirrors/so/solidity-by-example.github.io Solidity By Example是一个专注于以太坊…

2026/8/7 18:12:49 阅读更多 →
如何用G-Helper解决华硕笔记本性能管理臃肿问题?轻量级终极方案指南

如何用G-Helper解决华硕笔记本性能管理臃肿问题?轻量级终极方案指南

如何用G-Helper解决华硕笔记本性能管理臃肿问题?轻量级终极方案指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook…

2026/8/7 18:12:49 阅读更多 →
PoeCharm中文版:流放之路终极BD规划器,三步打造完美角色

PoeCharm中文版:流放之路终极BD规划器,三步打造完美角色

PoeCharm中文版:流放之路终极BD规划器,三步打造完美角色 【免费下载链接】PoeCharm Path of Building Chinese version 项目地址: https://gitcode.com/gh_mirrors/po/PoeCharm 还在为《流放之路》复杂的角色构建而烦恼吗?PoeCharm作为…

2026/8/7 18:12:49 阅读更多 →
G-Helper终极指南:如何用10MB轻量工具完全掌控华硕笔记本性能

G-Helper终极指南:如何用10MB轻量工具完全掌控华硕笔记本性能

G-Helper终极指南:如何用10MB轻量工具完全掌控华硕笔记本性能 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenb…

2026/8/7 18:11:48 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →