c++高级---图解:C++中类的内存分布(总结)

【C++】图解类和对象(上) 本文介绍类和对象上的内容(附图解)。如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持! 阅读详情

定义一个类如下:

它的内存分布如图:

以上就完成内存布局的理解了,为了更好的运用,下面举个例子:

对上面代码的分析:

注:上面所有内容来某个自某个csdn网友个人理解,我感觉应该没问题(除非比较变态的c++编译器)。


 

 

 

 

下面内容比较杂,转自:http://blog.youkuaiyun.com/mal327/article/details/6784254

如何计算类对象占用的字节数?

一个空类的话1个字节。
这是为了保证n个连续空类声明时,变量地址有偏移,防止变量覆盖。
非空类的话用关键字sizeof计算。
如果手工计算就相当麻烦,光padding就一堆规则了。而且有些额外信息比如虚函数(多个虚函数也只产生一个vptr指针)等等。
一个类成员 ,当有虚函数时,有以下成分:各个数据成员,数据对齐产生的间隙,一个虚函数表的 "指针"(无虚不存在)。
构造函数不能用 memset(this, 0, sizeof(*this))) 初始化。原因就是每个类里面除了数据成员之外 ,还有一个虚函数表指针 。memcpy另一个同类型类的实例内容过去倒是可以 ,这种情况下该函数表指针可以正确复制过去。
注意虚函数表只在类有虚函数的情况下才存在, 没有虚函数不存在。 构造函数悄悄地帮你设置虚函数表的内容,并把正确的指针存放在对象中。

类在内存中分布

首先请看程序:

#include <iostream>
using namespace std;
class base{
public:
virtual void fun1()
//void fun1()
{
cout << "fun1 called !" << endl;
}
void fun2()
{
cout << "fun2 called !" << endl;
}
};
int main()
{
base s;
cout << sizeof(s)<< endl;
return 0;
}
代码的结果为4,这是由于虚指针的存在。 但是如果去掉virtual 代码的结果为1。

为什么呢?
这个涉及到类和结构体,在C++内部的排列方式。
我也不是很了解,只能就自己了解的一点知识做点回答,欢迎大家指正。
我们知道,C和C++虽然都支持结构体,但是,实际上表现是不一样的。C++的结构体,可以认为是类的一种变体,二者的差异性,类中成员,如果不声明,默认是Private的,结构体中成员,如果不声明,则默认是Public的。
但是,在C++里面,二者内部都可以内置成员函数,而C的结构体,内部只允许存在成员变量,如果需要内置成员函数,需要程序员显式声明函数指针变量,换句话说,就是C在结构体中管理成员函数,是程序员自己来管理,C++则是编译器代为管理。

这意味着什么呢?
在C++中,成员函数和成员变量,都是类和结构体的成员,但二者有所差异。
编译器在编译每个类时,不管这个类以后会实例化几个对象,首先,它会提取这些类的共性,放到一起,做成一个表。
比如类里面的非虚函数,这类函数,所有的对象共享一段函数代码,自然没有必要每个对象内部都设置一个函数指针,这太浪费内存了。
因此,一个类,所有的非虚函数,会被编译器排成一个符号表,放置在特定的编译期基础变量区。这实际表现看,是放在exe文件里面的,在调用一个程序时,是直接从文件中读出,并经过地址修订,准备使用,这部分连基栈都算不上,算是常量区了,所有的常量也是放在这个区。
嗯,函数内部的静态变量,类中的静态变量,静态函数,都是这个区。
那,除掉这些,类里面还有什么呢?
还有虚函数,我们知道,虚函数表示可能继承,事实上,多次(不是多重)继承后,一个类的虚函数内部会有一个栈,每个虚函数都有一个栈,每次调用该函数,会从栈顶开始call,当然,如果程序员愿意,也可以在继承的虚函数内部,通过调用父类的同名虚函数,逐级向下call,直至call完所有的虚函数为止。
这就说明,虚函数和普通成员函数不同,每个对象都有可能变化,因此,编译器就不敢把这个函数的指针,放在常量区,必须跟着对象走,注意,不是类,类是没有实体的,因此,不存在sizeof,只有对象存在大小。
还有就是普通成员变量,这些内容,每个对象也是不一样的,因此,每个对象必须自己建立一个表来管理,否则大家就混了。
因此,我们知道了,每个类,实例化对象之后,其实对象的实体在内存中的存储,就只包含虚函数和普通成员变量,这是C++编译器为了节约内存做得优化。

我们回到你的代码看,你的代码中,fun2是普通函数,被编译器放到常量区去了,因此,不占用对象空间,虚函数fun1,则需要占用,我们知道,32位操作系统,一个指针是4Bytes,函数指针也是指针,因此,你的结果是4Bytes。
取消了virtual 之后,fun1也变成了普通函数,因此和fun2等同处理,就不再占用对象空间,因此,对象空间为0了。
不过,我隐隐约约听谁说过,C++语言不允许对象空间为0,这样的话,对象指针就没有落点了,因此,一个对象的空间,至少占用1Byte,这就是你的结果为1的原因。

虚函数调用的几点补充说明:

类的虚函数,实际上内部存储上,表现为一个函数指针栈,栈底,是基类这个函数的指针,往上,实际上是继承类,该虚函数的继承函数的指针,一个类,被继承几次,比如说3次,最后一次继承,这个栈就有3层。有点绕。

举个例子吧
class A
{
virtual void Func(void)
};
class B : public A
{
virtual void Func(void)
};
class C : public B
{
virtual void Func(void)
};
这个A类,里面的Func指针就是它自己
B就是一个栈了,栈底是A::Func,栈顶是B::Func
而C就是三层的栈了,在B的基础上,栈顶又压入了C::Func

基本上就是这个管理关系。
我的话的意思是,在任何一层继承函数,都可以去手动去call父类的对应函数,完成对整个栈链上所有函数的调用。
因为我们知道,一个类的虚函数,一旦被继承,原来的父类函数指针就被压倒栈下面去了,从栈顶看,只有最后一层的函数指针。
比如C这个类看,我们看它的Func,只要它继承并实现了,那么,调用Func一定只能调用C::Func,B和A的由于看不到,因此是不会被调用的。
当然,如果C没有实现这个虚函数,则Func的栈上,没有C::Func,因此,直接Call会Call到B::Func,以此类推,如果B没有实现这个虚函数,表示未继承,则Call会Call到A::Func,这就是虚函数继承中,后实现的覆盖前实现的原理。
当然,如果A内没有实现Func的实体,做了一个纯虚函数,而B和C这些继承类也不实现,那么,编译器在构造符号表的时候,就会找不到任何一个Func的实体,该虚函数栈为空,无法连接,因此会报连接失败的错误,编译不能通过。

这种栈式管理,有好有坏,好处是后面的继承类,可以选择实现虚函数,也可以选择不实现,偷个懒。程序不会出错,下次调用该函数,会自动沿着它的继承关系,寻找父类以及更往前的爷爷类的函数实体,至少能找到一个执行其功能,简化开发。
但是,也有一个坏处,就是一个虚函数,一旦被继承类实现了,则父类的必然被覆盖,如果父类有什么内置的功能,就没有办法执行了,这很麻烦,由于面向对象的继承关系,我们总是希望,继承类的对应函数,只要完成它相对于父类增加的那部分功能就够了,父类的功能,还能继续执行,免得写重复的代码。

这个例子在MFC开发中很多,很多时候,我们的一个窗口类,是从CDialog这个类继承的,而CDialog,又是CWnd这个类继承的。针对一个虚函数方法,比如说CWnd::Create这个方法。
virtual BOOL Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect...
我们知道,创建一个窗口有一大堆事情要做,这些事情,MFC已经在CWnd的Create这个函数里面实现好了,但好死不死,它把这个函数方法设置为虚函数了,就是说,后续继承类可以自己来实现这个方法。
我们这么来假设,如果我们那个工程的窗口,继承自CDialog,然后,我们自己实现了这个Create方法,那完蛋了,由于C++这个覆盖特性,执行的时候,就只执行我们这个Create了,下面的CDailog::Create和CWnd::Create都执行不了,除非我们把那两个函数内部所有的代码抄一遍,否则,这个Create根本没有办法完成我们希望完成的功能。他失去了创建窗口的功能。
因此,为了解决这个问题,C++允许继承类的虚函数,显式调用父类的虚函数,以实现父类的基础功能,最后,才是我们自己新增加的代码。
这个意思主要是说,虚函数的继承,看似省事,但他不是想当然会先实现父类功能,后调用新增代码,需要我们手动call。
再看看这个例子,我们以VC建立一个MFC的对话框工程,就叫test。
// CtestDlg 对话框
class CtestDlg : public CDialog
{
// 构造
public:
CtestDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_TEST_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog(); //看好这一句啊,虚函数
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
};
注意其中OnInitDialog,好,我们来看看VC自动为我们生成的这个函数是怎么写的:
BOOL CtestDlg::OnInitDialog()
{
CDialog::OnInitDialog(); //看这句,在干吗?
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
注意到没,由于继承类的虚函数一旦实现,父类的虚函数就被自动屏蔽,VC也必须手动实现对父类虚函数的层级调用,才能完成基本功能。
很多时候,我们的同学,手动继承一个类之后,玩虚函数老是忘了这个手动调用父类,结果发现,虚函数功能越继承越少,甚至继承到功能没有了,就是搞忘了这点。
但是,上述代码是VC的向导自动添加的,VC并没有对此作显式说明,结果,大家在只用IDE开发的过程中,老是关注不到这个细节,自己做的时候就出错。这类问题还很多。

C++对象模型之简述C++对象的内存布局 在C++中,有两种类的成员变量:static和非static,有三种成员函数:static、非static和virtual。那么,它们如何影响C++的对象在内存中的分布呢? 当存在继承的情况下,其内存分布又是如何呢? 下面就一个非常简单的类,通过逐渐向其中加入各种成员,来逐一分析上述两种成员变量及三种成员函数对类的对象的内存分布的影响。 注:以下的代码的测试结果均是基于Ubuntu 14.0 阅读详情

相关推荐

二十,让AI帮你做项目规划:甘特图生成与任务分解实战

首先,使用AI帮助明确项目范围和目标,这是任何成功规划的基础。如何使用AI使用提示词引导AI帮你澄清项目目标:请帮我分析以下项目描述,提取明确的项目目标、范围和成功标准:[项目描述]请以SMART原则(具体、可衡量、可实现、相关、有时限)重新表述这些目标。

2401_88760782的博客 3023

关于C++的类对象,内存分布问题

原问题如下:#include using namespace std;class base{public: virtual void fun1() { cout  } void fun2() { cout  }};int main(){    base s;    cout     return 0;}代码的结果为4。这个我觉得是因为那个虚函数表里的一个指针占了4个字节但是如果我去掉vir

hugohong的专栏 1031

精确预测项目时间:甘特图7分钟完成任务时长估计与关键路径管理

通过甘特图中的依赖关系和任务间的连接,您可以明确识别和管理关键路径,确保关键任务按时完成,从而保证项目能够按计划进行。甘特图中的任务时长估计和关键路径管理是精确预测项目时间和有效管理项目的重要工具。通过甘特图的任务时长估计和关键路径管理,您可以实现精确的时间预测和项目时间的有效管理。甘特图提供了任务时长估计和关键路径管理的功能,帮助您实现精确的时间预测和管理。简介:本文将介绍甘特图模板中的任务时长估计和关键路径管理的重要性,以及如何通过使用模板来精确预测项目时间和管理关键路径。每个任务都需要一个合理的。

weixin_43127898的博客 1829

C++——类实例化内存的分配和this指针的使用

一、类的实例化分配内存 类是结构体的演变,是一种数据类型,如int和char一样是类型。那么在类实例化时,内存是怎样分配的呢? 步骤是:(可以通过代码考证) 1.属性、方法不需要初始化,因为这些全部是指针。 2.初始化派生类的静态字段。 3.初始化派生类的非静态字段。 4.初始化基类的静态字段。 5.初始化基类的非静态字段。 6.调用基类的构造函数。 7.调用派生类的构造函数。

liufang1a2b的专栏 3040

别再手动排期了!用DooTask+通义千问,5分钟搞定项目甘特图与风险预警

本文介绍了如何利用DooTask和通义千问AI技术,在5分钟内快速生成项目甘特图与风险预警。通过智能拆解需求、自动规划资源和实时风险预警,大幅提升项目管理效率,特别适合应对模糊需求和紧急项目。AI规划相比传统方式,在隐性需求挖掘、冲突预判和弹性计算方面具有显著优势。

weixin_30338481的博客 304

C++类继承内存布局详解图(一目了然)

看了这个内存布局图详解之后,对于C++的了解更加深刻了,之前不懂得一头雾水的东西全都清楚了。

用Xmind制作甘特图手把手教程(超详细!

甘特图是一种可视化的项目管理工具,展示项目进度的时间表。它通过水平条形图来表示任务、它们的持续时间以及相互依赖关系。甘特图最早由卡罗尔·亚达米耶茨基(Karol Adamiecki)发明,后由亨利·甘特(Henry Gantt)推广。这种图表帮助项目经理有效跟踪进度、管理资源,确保项目按计划进行。

weixin_67105760的博客 9600

MITRE ATT&CK超详细学习笔记-01(背景,术语,案例)

MITRE是一个向美国政府提供系统工程、研究开发和信息技术支持的非营利性组织,于1958年从麻省理工学院林肯实验室分离出来后参与了许多最高机密的政府项目,开展了大量的网络安全实践。例如,MITRE公司在1999年发起了常见披露漏洞项目(CVE,CommonVulnera-bilitiesandExposures)并维护至今。其后,MITRE公司还维护了常见缺陷列表(CWE,CommonWeaknessEnumeration)这个安全漏洞词典。.........

Zichel77的博客 1万+

Qwen2.5-7B-Instruct惊艳作品:中文技术方案文档→甘特图任务分解自动生成

本文介绍了如何在星图GPU平台上自动化部署Qwen2.5-7B-Instruct镜像,实现中文技术文档到甘特图的自动生成。该镜像能够智能解析技术方案,自动创建项目任务分解和时间线,适用于软件开发、工程规划等项目管理场景,显著提升项目规划效率与准确性。

weixin_42527665的博客 880

Qt思岚激光雷达

Qt关于思岚激光雷达研究示例,本示例采用qt界面开发,可以串口也可以tcp进行设备连接。接收数据进行相关的数据进行绘图, 这种雷达可以用于大屏触摸场景,会场互动触摸场景开发。 #ifndef MAINWIDGET_H #define MAINWIDGET_H #include <QTimer> #include <QWidget> #include "lidarmgr.h" namespace Ui { class MainWidget; } class MainWidget.

cqltbe131421的博客 1596

【Basis】Lumerical licence center 无法连接的问题

端口,我们需要确认该端口是否被其他程序占用。这里我们将介绍如何处理这一问题。后,今天电脑更新后我无法打开。终结占用该端口的程序后再次打开。

u011699626的博客 313

项目管理里程碑规划:自动拆解任务依赖关系

利用轻量级大模型VibeThinker-1.5B-APP,可将复杂算法或数学问题自动拆解为带依赖关系的子任务序列,生成可执行的任务拓扑图。该技术特别适用于竞赛编程、系统开发和科研设计,显著提升任务规划效率与完整性,支持本地部署与工程化集成。

weixin_42596214的博客 1050

STM32F4 SPI FLASH(W25Q128)驱动详解(含DMA+完整读写擦除+低功耗)

本文实现了一款基于STM32 HAL库的SPI Flash驱动,以W25Q128为例,提供了完整的初始化、读写、擦除、ID读取等功能。驱动集成了DMA传输、超时保护、页对齐写入等特性,支持扇区擦除、整片擦除、页写入及跨页缓冲写入。代码结构清晰,易于移植到其他SPI Flash型号(如W25Q64、W25Q16等),适用于数据存储、固件升级、文件系统等嵌入式场景。

kevin1499的博客 96

AI人工智能测面相 准确率95%,准的有点可怕!

AI人工智能测面相 准确率95%,准的有点可怕! 人工智能看面相 相由心生,境随心转。面相学通过观看面部特征来解码人生命运,面相研究院程序则利用人工智能深度神经网络学习技术与人脸识别定位技术将这一中国传统文化重新呈现 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新...

qq_43030938的博客 1万+

AI视频生成模型训练:从数据准备到部署全流程

咱们这次的目的就像是要建造一座超级厉害的AI视频生成魔法城堡。范围呢,就是从收集建造城堡的材料(数据准备)开始,到把城堡搭建起来(模型训练),再到让城堡能供大家使用(模型部署),涵盖了整个过程的方方面面。接下来我们会先给大家介绍一些重要的术语,就像认识冒险途中的关键道具一样。然后引入一个有趣的故事,带大家进入AI视频生成的奇妙世界,解释核心概念以及它们之间的关系。接着会详细讲解核心算法原理、数学模型和公式,还会有项目实战,带大家亲自体验代码的魅力。

小白菜的博客 399

【论文翻译】YOLO26: KEY ARCHITECTURAL ENHANCEMENTS AND PERFORMANCE BENCHMARKING FOR REAL-TIME OBJECT DETEC

本研究对Ultralytics YOLO26进行了全面分析,重点阐述了其在实时边缘目标检测领域的关键架构改进与性能基准测试结果。YOLO26于2025年9月发布,是YOLO系列中最新、最先进的模型,专为在边缘设备和低功耗设备上实现高效能、高精度和部署就绪性而设计。论文依次详细介绍了YOLO26的架构创新,包括移除分布焦点损失(DFL)、采用端到端无非极大值抑制(NMS)推理、集成渐进式损失(ProgLoss)和小目标感知标签分配(STAL),以及引入MuSGD优化器以实现稳定收敛。

Limiiiing的博客 1682

Ganttable 甘特图核心功能概览

本文主要是关于核心功能的介绍,重点阐述其在项目管理中的实用性和便利性。对于 Ganttable 的 AI 能力,请您查看。现在,让我们聚焦探究 Ganttable 如何助力高效项目管理,优化工作流程,以及提升团队协作效率。

weixin_43892804的博客 4776

深入浅出:使用Python爬取链家二手房数据

在数据驱动的时代,房地产数据作为社会经济的重要指标,一直是数据分析师、投资者和研究人员关注的焦点。链家作为国内领先的房产中介平台,其二手房数据具有较高的真实性和时效性。然而,官方API的访问限制和数据获取的门槛,让很多初学者望而却步。本文将带你从零开始,使用Python编写一个符合robots.txt规范的链家二手房爬虫,获取标题、户型、价格等信息。文章不仅会提供完整代码,还会深入讲解反爬策略、请求头伪装、数据解析、异常处理等实战技术。目录前言:为什么要写这篇博客?一、爬虫前的准备:法律与道德。

2201_76125261的博客 90

Qwen3-VL:30B飞书集成效果:上传项目甘特图→自动识别里程碑→生成进度风险预警

本文介绍了如何在星图GPU平台上自动化部署‘星图平台快速搭建 Clawdbot:私有化本地 Qwen3-VL:30B 并接入飞书(上篇)’镜像,实现甘特图智能解析与项目进度风险预警。用户上传项目甘特图至飞书群聊,AI即可自动识别里程碑、计算偏差并生成可执行缓解建议,显著提升项目管理效率。

weixin_42599558的博客 412

OPC通信从入门到精通_1_OPC基础知识及简单C#程序编写(OPCDA,OPCUA简介;OPC通信数据流框架图;C#程序编写)

ModbusTCP通信是采用直接方式进行通信,用OPC的方式如何去做呢?PLC作为ModbusTCP服务器,用KepServer作为ModbusTCP客户端,同时作为OPC服务器,PC作为OPC客户端新建项目,加载dll库(利用COM技术写的)添加引用,查看到其中包含了众多方法其中OPCGroups继承于IOPCGroups接口。

分享学习成长历程,Winter is coming! 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

StarGantt 3.0 AI甘特图技术解析与应用实践

甘特图作为项目管理的重要工具,通过可视化时间轴帮助团队规划任务与资源。现代AI技术正在革新传统甘特图的生成方式,StarGantt 3.0采用BERT变体模型和强化学习算法,实现了从自然语言描述到完整项目计划的智能转换。这种技术突破显著提升了规划效率,特别在敏捷开发和大型活动管理等场景中,能自动识别任务依赖和资源冲突。结合WebGL 2.0渲染引擎,系统支持千人级任务的流畅操作,为企业级项目管理提供了智能化的解决方案。

weixin_29053695的博客 236

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Qwen3-VL:30B企业应用:飞书项目群中甘特图截图→自动识别风险点+预警建议

本文介绍了如何在星图GPU平台上自动化部署Clawdbot镜像,实现Qwen3-VL:30B多模态模型的私有化本地部署并接入飞书。该方案能自动识别飞书群聊中的甘特图截图,检测项目进度延迟、资源冲突等风险点,并提供实时预警建议,大幅提升企业项目管理效率。

weixin_36212459的博客 216

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Qwen3-4B-Instruct惊艳效果:复杂项目计划书→甘特图描述+里程碑拆解

本文介绍了如何在星图GPU平台上自动化部署Qwen3-4B-Instruct-2507镜像,实现复杂项目计划书的智能解析与甘特图生成。作为Qwen3系列的端侧/轻量旗舰模型,该镜像支持256K token超长上下文处理,可自动提取任务节点、构建时间轴并输出可视化甘特图,大幅提升项目管理效率。

weixin_42351520的博客 796

Roadmap可视化革命:当传统甘特图遇上AI智能规划

本文探讨了Roadmap可视化技术的革命性变革,从传统甘特图到AI智能规划的转变。通过机器学习、三维可视化和闭环学习系统,现代Roadmap工具显著提升了项目管理效率,实现动态资源分配和风险预测。案例显示,智能系统可减少82%的响应时间,助力企业战略规划。

i0j1k2l3m的博客 660

AI项目会议纪要自动生成与可视化系统

现在每周项目例会结束5分钟内就能发出图文并茂的纪要,再也不用熬夜整理录音了。AI生成的行动项还会自动同步到Jira,真正实现会议决策闭环管理。如果你也在为会议效率烦恼,强烈推荐试试这个开发思路。作为项目经理,每次开完会最头疼的就是整理会议纪要。最近尝试用AI做了一个会议纪要自动生成系统,全程在。上开发,效果出乎意料的好。分享下实现思路和踩坑经验。整个过程最惊喜的是用。

SunstoneOwl39的博客 1109

AI如何助力DHTMLX-GANTT开发?5个智能优化技巧

当用户拖拽某个任务节点时,AI会自动分析依赖关系链,给出两种优化方案:一种是保持原有任务间隔的保守方案,另一种是重新计算关键路径的激进方案。输入"任务B必须在任务A完成后开始,任务C需要任务A和B都完成"这类描述,AI不仅会设置前置任务ID,还能检测循环依赖。有次我误设了A→B→C→A的循环,系统立即用红色高亮提示,并建议改为A→B→C的线性关系。现在每次保存修改,系统都会自动生成带时间戳的版本快照,回退到任意历史状态只要点两下,这对频繁调整的项目计划简直是救命功能。

BlackironPanther23的博客 233
上一篇: 观察者模式设计--模式随笔系列:气象站的故事-观察者模式(Observer)
下一篇: c++高级---C_C++的union的学习笔记总结
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值