const讨论



Huang  23:34:58
全局下,const放在ram的常量数据区
倏地飞  23:35:31
你加了那句 bin没变大?
Huang  23:35:44
局部函数里,你编译的时候肯定是需要占用rom区 存储这个值得
倏地飞  23:36:02
全局的时候就不占了吗?
倏地飞  23:36:10
应该占的吧?
Huang  23:36:22
全局在编译的时候不占用
倏地飞  23:36:35
不应该啊
Huang  23:36:44
运行的时候 就直接分配对应的ram区域了
倏地飞  23:37:48
至少这个语句要占空间的
倏地飞  23:37:53
怎么会不占呢?
倏地飞  23:38:03
除非他是跟宏一样
倏地飞  23:38:05
替换掉
Huang  23:38:06
我再验证下
倏地飞  23:39:55
貌似占的
Huang  23:40:53
占 必须占
倏地飞  23:40:56


倏地飞  23:41:00
必须占
倏地飞  23:41:15
//const char *cst = "ccccccccccccccccccccccc";


倏地飞  23:41:42
这句话占了48个字节的ROM空间
Huang  23:44:25
const char *cst = "c";
const char *cst = "caaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
Huang  23:44:39
这样编出来是一样大的
倏地飞  23:44:59
是吗? 我验证下
倏地飞  23:45:27
果然是
Huang  23:45:29

倏地飞  23:45:41
为什么?
倏地飞  23:46:30
我估计是不是这样
Huang  23:46:41
因为是指针变量
倏地飞  23:46:45
只读存储区那块 是固定的
倏地飞  23:47:07
我感觉应该如果你把这个字符串加到一定的大小他就会变大
Huang  23:47:32
const char cst[] = "c";
const char cst[]= "caaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
倏地飞  23:47:32
一定是这样的
Huang  23:47:45
这样会变大
倏地飞  23:48:40
你这样是前面变大了
倏地飞  23:48:45
跟后面没关系
倏地飞  23:49:01
指针只占4字节
倏地飞  23:49:06
数组就占多了
发送消息内容超长,请分条发送。
发送消息内容超长,请分条发送。
倏地飞  23:50:10


倏地飞  23:50:17
这样也变大了
Huang  23:50:27
擦 
倏地飞  23:50:57
我猜测是这样的 只读存储区那块 开始是固定的 当你超过那个固定值他也跟着变大
倏地飞  23:51:20


Huang  23:51:46
也就是说有开个固定的存。超过这个固定的值 就会再开一个新的存储区
Huang  23:51:56
应该是这样
倏地飞  23:52:15
对的 我又加了三个ccc 大小没变
倏地飞  23:52:31
所以说他应该是分片的 不是按需分配的
倏地飞  23:53:24
所以之前我猜测的const估计没错
倏地飞  23:54:14
"aaaa"会占用到只读存储区,前面的占用全局数据区
Huang  23:54:44

Huang  23:54:50
没错
倏地飞  23:54:51
RAM里面加载的程序我之前也考虑一个问题
倏地飞  23:54:59
就是ROM一般都比ram大得多
倏地飞  23:55:16
所以ram不是一次性装载ROM里面的代码段的
倏地飞  23:55:37
他应该是有他的一套规则 
倏地飞  23:56:07
转载一小段之后给cpu去执行
倏地飞  23:56:18
执行完再继续装载
Huang  23:56:47
这个和你用的什么rom有关
Huang  23:57:05
也就是flash 
倏地飞  23:57:13

倏地飞  23:57:27
ROM一般都比ram大
Huang  23:57:39
spi flash允许程序之间在flash中运行
Huang  23:57:51
nand flash不允许直接运行
Huang  23:58:02
一定要拷到ram中运行
Huang  23:58:15
我们公司的就是ram比rom大啊 
Huang  23:58:33
256M FLASH 512M DDR3RAM
Huang  23:58:43
我去洗澡准备睡觉
倏地飞  23:58:45
我擦
倏地飞  23:58:47
好的
Huang  23:58:48
老婆在催啊
Huang  23:58:52
我了个去 
倏地飞  23:58:56
今天分析了下
Huang  23:58:57
明天再继续搞
倏地飞  23:59:02
好多不清楚了搞明白了
Huang  23:59:08
嗯  好样的
倏地飞  23:59:08
继续搞
倏地飞  00:00:07
mtk25平台默认的是128Mbit flash memory 和 32Mbit SRAM,
倏地飞  00:00:28
就是我们通常所说的是16M ROM和4M RAM
<think> 嗯,用户想了解编程语言中const的使用和含义。结合之前的引用材料,用户对C/C++中的const特别关注,但讨论范围可能扩展到其他语言。 用户提供的四个引用很有价值:引用[1]强调const的适用场景选择,引用[2]提到const成员函数在多线程和STL中的应用,引用[3]解释了const的基本定义和语法,引用[4]则展示了指针与const结合的复杂用例。这些材料正好覆盖了const的核心概念到高级用法。 用户可能是个中级开发者,正在学习代码规范和优化。ta特意提到"可能是在编程语言中使用Const的方法、作用等",说明需要通用性知识,但引用的材料全是C/C++示例,所以重点应该放在C/C++上,同时暗示其他语言的差异。 需要系统性地组织回答: - 先从基本定义切入(如引用[3]的常量声明) - 强调编译期保护机制(引用[1]提到的不可修改特性) - 函数应用部分重点展开const成员函数(引用[2]) - 指针组合是难点,用引用[4]的案例说明 - 最后补充现代语言对比(如JavaScript的const差异) 特别注意引用标注:每个技术点要关联对应引用,比如讨论配置参数时标注[^1],解释常量指针时标注[^4]。用户似乎很重视引用依据。 用户可能隐含的需求是:如何在实际项目中合理使用const避免错误?所以性能和安全部分要突出实践建议,比如引用[1]说的"谨慎考虑未来修改"。线程安全部分虽然引用[2]提到,但用户没明确问,简要带过即可。 相关问题设计要层层递进:从基础语法到高级应用,最后引申到语言对比。第二个优化问题特意呼应引用[1]的"谨慎考虑",这样能让用户感觉问答有连贯性。 </think> 在编程语言中(尤指C/C++),`const`关键字用于声明**不可修改的常量**,其核心作用是**增强代码安全性和可读性**。以下是关键知识点: --- ### 一、基础用法与含义 1. **常量声明** ```c const int MAX_SIZE = 100; // 值不可修改 MAX_SIZE = 200; // ❌ 编译错误 ``` - 声明后变量值被锁定,修改会触发编译错误[^3]。 2. **指针与`const`的组合** - **指向常量的指针**(数据不可改): ```c const int* p = &a; // 通过p不能修改a的值 *p = 10; // ❌ 编译错误 ``` - **常量指针**(指向地址不可改): ```c int* const p = &a; // p不能指向其他地址 p = &b; // ❌ 编译错误 ``` - **双重`const`**(指针和数据均不可改): ```c const int* const p = &a; // 等价于 int const* const p [^4] ``` --- ### 二、进阶应用场景 1. **函数参数与返回值** - **保护参数不被修改**: ```c void print(const std::string& str) { // str[0] = 'A'; ❌ 禁止修改 } ``` - **返回常量值**(避免返回值被意外修改): ```c const int getValue() { return 42; } ``` 2. **类成员函数** - **`const`成员函数**:承诺不修改对象状态(多线程安全基础)[^2] ```cpp class Vector { public: int size() const { return length; } // 不会修改成员变量 }; ``` --- ### 三、核心作用与设计原则 1. **安全性** - 防止意外修改关键数据(如配置参数、全局常量)[^1]。 - 避免多线程环境下的数据竞争(`const`成员函数保障对象状态稳定)[^2]。 2. **可读性与维护性** - 明确标识不应修改的变量,降低代码理解成本。 - 编译器强制检查,减少运行时错误。 3. **优化空间** - 编译器可能将`const`常量直接内联优化(如替换字面值)。 --- ### 四、与其他语言的对比 | 语言 | 类似机制 | 差异点 | |------------|------------------|---------------------------| | Java | `final` | 仅限变量初始化后不可变 | | Python | 无直接等价 | 靠命名约定(如全大写) | | JavaScript | `const` | 阻止重新赋值,但对象属性可改 | > 📌 **最佳实践**:优先对不应修改的变量使用`const`(如数学常数、配置文件),但对可能迭代的变量(如算法中间值)需谨慎[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值