const变量放在哪里?彻底搞懂C语言常量存储位置的8大核心场景(附内存图解)

C++部署ONNX Runtime性能调优:7大核心技术点深度解析 在机器学习模型部署领域,性能优化是工程落地的核心挑战。模型推理在生产环境中需要兼顾速度与稳定性,这通常涉及从基础概念到工程实践的系统性调优。其核心原理在于通过优化计算图、内存管理和硬件资源调度来减少延迟、提升吞吐。技术价值在于能将一个可运行的部署转变为高效、可靠的生产级系统,直接影响服务的响应能力和资源成本。应用场景广泛覆盖服务器端推理、边缘计算和高并发在线服务等。本文聚焦C++环境,深入剖析ONNX Runtime(ORT)部署中的性能瓶颈,系统性地拆解了执行提供程序选型、图优化、内存分配、批处理策略等7 阅读详情

第一章:const变量存储位置的核心概念

在Go语言中,const关键字用于定义编译期常量,这些常量的值在程序运行前就已经确定。与变量不同,常量不占用运行时的内存空间,其存储位置由编译器根据使用场景进行优化处理。

常量的本质与生命周期

Go中的常量并非存储在栈或堆中,而是嵌入到编译后的指令或作为字面量直接参与表达式计算。编译器会在编译阶段将所有对常量的引用替换为其字面值,这一过程称为“常量折叠”。 例如:
// 定义一个常量
const MaxSize = 100

func main() {
    var arr [MaxSize]int // 编译器在此处直接使用100
    println(len(arr))    // 输出100
}
上述代码中,MaxSize不会在运行时分配内存,而是在编译时被替换为数值100。

常量的存储优化策略

编译器会根据常量的类型和用途决定其最终的“存在形式”:
  • 基本类型常量(如int、string)通常被内联到机器指令中
  • 字符串常量可能被集中存放在只读数据段(.rodata)
  • 未导出的包级常量不会生成符号表条目,减少二进制体积
下表展示了不同类型常量的典型处理方式:
常量类型编译期处理方式是否占用运行时内存
int/float/bool常量折叠,内联至指令流否
字符串放入.rodata节或内联视使用情况而定
枚举(iota)逐个展开为整型字面量否
graph TD A[源码中定义const] --> B{编译器分析} B --> C[基本类型: 内联替换] B --> D[字符串: .rodata 或内联] B --> E[iota序列: 展开为整数] C --> F[生成机器码] D --> F E --> F

第二章:全局const变量的存储分析

2.1 全局const变量的内存布局理论

在C++和Go等编译型语言中,全局`const`变量的内存布局遵循特定规则。这些变量通常被编译器放置在只读数据段(`.rodata`),以防止运行时修改。
内存区域划分
程序的内存空间一般分为代码段、数据段、堆、栈和只读数据段。全局`const`变量存储于`.rodata`段,操作系统通过内存页保护机制禁止写操作。
示例与分析
package main

const message = "Hello, World!"

func main() {
    println(message)
}
上述Go代码中,字符串常量`"Hello, World!"`和`message`符号会被编译器置入`.rodata`段。链接后,该地址固定且不可写。
  • 只读性:任何写入尝试将触发段错误(SIGSEGV)
  • 生命周期:从程序启动到终止始终存在
  • 共享性:多个进程可共享同一物理内存页

2.2 不同编译器对全局const的处理差异

在C++中,全局`const`变量的存储属性和链接方式可能因编译器而异,影响符号可见性和内存布局。
符号可见性差异
某些编译器(如GCC)默认将全局`const`变量视为内部链接(internal linkage),不导出到符号表;而MSVC在特定模式下可能生成外部链接符号。

// global_const.cpp
const int config_value = 42;
上述代码在GCC中通常不产生可被其他翻译单元引用的符号,除非显式声明为extern const int config_value = 42;。
编译器行为对比
  • GCC/Clang:默认内部链接,减少符号冲突
  • MSVC:部分版本保留外部链接,兼容旧代码
  • 嵌入式编译器:可能直接优化为立即数访问
编译器默认链接属性是否分配存储
GCC内部链接仅当取地址时
MSVC外部链接是

2.3 全局const在.rodata段中的实际验证

在C/C++中,全局const变量默认具有内部链接,并被编译器放置于只读数据段(.rodata)。通过底层工具可验证其内存布局。
代码示例与编译验证
const int global_const = 42;
int main() {
    return global_const;
}
上述代码中,global_const 被定义为全局常量。使用GCC编译后,可通过 objdump -t 或 readelf -S 查看段信息。
段属性分析
执行命令:
readelf -S executable | grep rodata
输出结果中可见 .rodata 段存在,且标志为 A(分配)和 R(只读),表明该段加载到内存后不可修改。
  • .rodata 用于存储不可变数据,如字符串常量、const全局变量
  • 链接时,多个目标文件的.rodata会被合并到同一段
  • 运行时映射至只读内存页,防止意外写入

2.4 跨文件引用时的链接属性探究

在多文件项目中,符号的链接属性决定了其可见性与绑定行为。`extern` 关键字允许变量或函数在多个翻译单元间共享,而 `static` 则限制符号仅在本文件内可见。
链接属性分类
  • 外部链接:默认全局符号,可在其他文件中通过 extern 引用;
  • 内部链接:使用 static 修饰,仅限本文件访问;
  • 无链接:局部变量,不具备跨文件能力。
示例代码

// file1.c
int global_var = 42;        // 外部链接
static int local_var = 10;  // 内部链接

// file2.c
extern int global_var;      // 正确:引用外部符号
// extern int local_var;    // 错误:static 变量不可见
上述代码中,global_var 具有外部链接,可在 file2.c 中安全引用;而 local_var 被限定于 file1.c,防止命名冲突,增强模块封装性。

2.5 实验:通过反汇编观察全局const存放位置

在C++中,全局`const`变量的存储位置可能因编译器优化而异。本实验通过GCC编译器结合`objdump`工具进行反汇编分析。
测试代码

const int global_const = 42;
int main() {
    return global_const;
}
该代码定义了一个全局常量`global_const`,并在`main`函数中使用它。
反汇编分析
执行命令:g++ -c main.cpp && objdump -t main.o,查看符号表。输出显示`global_const`位于`.rodata`段(只读数据段),符号类型为`R`,表明其存储于只读内存区域。
  • .rodata 段用于存放不可修改的常量数据
  • 全局 const 变量默认具有内部链接(internal linkage)
  • 若被引用,编译器会为其分配实际存储空间

第三章:局部const变量的存储机制

3.1 局域const变量是否真的存于栈中

在C++中,局部`const`变量通常被编译器优化为直接嵌入指令流或放入只读数据段,而非一定存储于栈中。
典型示例分析

void func() {
    const int val = 42;      // 可能不分配栈空间
    int arr[val];            // val作为常量表达式使用
}
上述代码中,`val`被声明为`const int`且初始化为字面量。编译器可将其识别为常量表达式,在符号表中以编译时常量处理,实际不会为其分配栈内存。
存储行为的决定因素
  • 若`const`变量地址未被获取(如取址操作&),编译器倾向于优化掉实际存储
  • 一旦发生取址或动态初始化,变量将分配在栈上
  • 全局或静态作用域的`const`变量通常位于.rodata段
因此,局部`const`变量是否存在于栈中,取决于其使用方式与编译器优化策略。

3.2 编译器优化对局部const存储的影响

在现代编译器中,局部 `const` 变量常被视为不可变值,从而触发常量折叠、死代码消除等优化策略。这可能导致变量不分配实际栈空间,直接被内联为立即数。
优化示例
const int size = 10;
int arr[size];
for (int i = 0; i < size; ++i) {
    arr[i] = i * 2;
}
上述代码中,`size` 被声明为局部 `const`,编译器可在编译期确定其值,将循环上限直接替换为 `10`,并可能展开循环。
内存布局影响
  • 局部 `const` 基本类型通常不占用运行时栈空间
  • 若取地址(如 &size),编译器可能被迫为其分配存储
  • 复杂类型(如 const std::string)仍需构造,但可能被常量化

3.3 实验:禁用优化后观察局部const的内存行为

在编译器优化开启时,局部 `const` 变量可能被直接替换为立即数,不分配实际内存。为观察其真实内存行为,需关闭优化(如使用 `-O0` 编译)。
实验代码示例
int main() {
    const int val = 42;         // 定义局部const变量
    int *ptr = (int*)&val;      // 取地址并尝试修改
    printf("Address: %p\n", &val);
    *ptr = 100;                 // 非法修改,但可观察内存变化
    printf("Modified: %d\n", val);
    return 0;
}
上述代码中,尽管 `val` 被声明为 `const`,但在 `-O0` 下编译器会为其分配栈空间。通过指针强制修改,可验证其内存位置是否真实存在。
关键观察点
  • 打印地址确认变量位于栈上
  • 禁用优化后,即使 `const` 也占用内存单元
  • 值看似不可变,实为编译期常量折叠所致
该实验揭示了“常量”在底层的实际存储机制,有助于理解优化对内存布局的影响。

第四章:复合类型const变量的存储特性

4.1 const数组的内存分配与存储位置

在Go语言中,const数组并非运行时对象,其值在编译阶段即被展开并内联到使用位置。由于const的本质是字面量替换,它们不占用独立的内存地址空间。
内存布局特点
const数组不会在栈或堆上分配存储空间。编译器会将每个引用处直接替换为对应的常量值,因此不存在指向数组首地址的指针。
// 示例:const不能用于定义数组类型
const size = 5
// 下面这行非法:const不支持复合数据类型如数组
// const arr [size]int = [5]int{1,2,3,4,5}
上述代码说明const无法声明数组类型,仅基本类型可作为常量。
替代方案与存储行为
若需固定数据结构,应使用var配合unexported变量或iota枚举:
var LookupTable = [5]int{2, 4, 8, 16, 32} // 存储于静态数据段
此类变量在程序加载时分配至静态存储区,生命周期贯穿整个运行期。

4.2 const指针与指向const的指针区别解析

在C++中,`const`关键字与指针结合时会产生两种不同的语义:**const指针**和**指向const的指针**,理解其差异对编写安全的代码至关重要。
指向const的指针(Pointer to const)
表示指针所指向的数据不可修改,但指针本身可以改变指向。
const int val1 = 10, val2 = 20;
const int* ptr = &val1;  // 指向const数据
ptr = &val2;             // ✅ 允许改变指针指向
// *ptr = 30;            // ❌ 编译错误:不能修改指向的数据
此处`const`修饰的是`int`,即数据为常量。
const指针(Const pointer)
指针本身不能更改指向,但可通过指针修改其所指向的数据(除非数据也为const)。
int x = 5, y = 8;
int* const ptr = &x;     // const指针必须初始化
*ptr = 6;                // ✅ 修改所指数据
// ptr = &y;             // ❌ 不允许改变指针本身
`const`修饰的是指针变量`ptr`,使其成为常量地址。
两者对比总结
类型指针可变?数据可变?语法示例
指向const的指针✅❌const int* ptr
const指针❌✅(若数据非常量)int* const ptr

4.3 结构体中const成员的实际存放分析

在Go语言中,const并非变量,不占用结构体内存布局空间。它属于编译期常量,仅在符号表中存在,不会参与运行时数据分配。
内存布局特性
结构体的内存由其字段类型和对齐规则决定,而const成员不会出现在结构体实例中。例如:
const MaxSize = 100

type Buffer struct {
    data [MaxSize]byte
    len  int
}
此处MaxSize仅用于数组长度定义,不作为Buffer的实例成员存储。实际内存仅包含data数组和len字段。
符号解析机制
const在编译阶段被内联替换,所有引用处直接代入字面值。可通过以下表格说明其与var的区别:
特性constvar
存储位置符号表(编译期)数据段(运行时)
地址获取不允许允许
内存占用无有

4.4 实验:使用gdb验证复合类型const变量地址

在C++中,`const`修饰的复合类型变量(如指针、引用、结构体)是否分配内存,常引发误解。通过GDB调试器可直观验证其地址分配情况。
实验代码

#include <iostream>
struct Data {
    int x;
    double y;
};
int main() {
    const Data d = {42, 3.14}; // const结构体变量
    std::cout << &d << std::endl;
    return 0;
}
编译后加载至GDB,即使变量为`const`,仍可通过print &d获取有效内存地址。
关键观察点
  • 所有具有静态存储期或自动存储期的对象,无论是否const,均分配地址;
  • 复合类型如结构体,即使被const修饰,仍占用栈空间;
  • GDB中x/2gx &d可查看其内存布局,验证成员排列。
该实验表明,`const`不阻止地址分配,仅限制写操作。

第五章:总结与常见误区辨析

避免过度设计配置结构
在实际项目中,开发者常倾向于使用嵌套层级过深的配置结构,例如将数据库、缓存、日志等全部嵌入一个全局 Config 对象。这种做法增加了维护成本,并容易引发序列化错误。应采用扁平化设计,按模块分离配置。
  • 使用结构体标签(如 mapstructure)明确字段映射关系
  • 避免依赖默认 JSON 解析行为处理环境变量
  • 优先通过接口抽象配置源,便于后续扩展 Consul 或 Etcd 支持
环境变量加载顺序陷阱
Viper 等库允许从多种源加载配置,但若未正确调用 viper.BindEnv() 或设置读取顺序,会导致生产环境仍使用开发默认值。

viper.SetConfigName("config")
viper.AddConfigPath(".")
viper.BindEnv("database.port", "DB_PORT") // 显式绑定关键字段
viper.AutomaticEnv()
viper.ReadInConfig()
热更新机制误用
部分团队启用 viper.WatchConfig() 后,默认回调函数未做变更验证,导致配置文件保存时触发多次无意义重载。应在回调中加入字段比对逻辑,仅当真实变更时才重启服务组件。
误区正确做法
直接解析 YAML 到 map[string]interface{}定义具体结构体并验证字段有效性
在 init() 中远程拉取配置延迟到 main 启动阶段,增加超时与降级策略
读取本地配置 加载环境变量 验证合并结果
LSM6DSOW陀螺仪轮询驱动:从I2C/SPI配置到数据读取全解析 惯性测量单元(IMU)是现代嵌入式系统中实现姿态感知与运动跟踪的核心传感器,其通过加速度计和陀螺仪测量线性加速度与角速度。在嵌入式开发中,轮询(Polling)作为一种基础且可靠的通信方式,通过主循环主动查询传感器状态,简化了初始调试与验证流程。对于I2C/SPI接口的数字传感器,掌握寄存器配置、数据就绪标志检查及原始数据转换是通用的驱动方法,能够快速验证传感器工作状态并理解数据流。LSM6DSOW作为一款高性能6轴IMU,支持可配置的量程与输出数据速率,适用于无人机飞控、手持云台等高动态场景。本文以LSM 阅读详情

相关推荐

中心对数比变换(Centered Log Ratio Transformation,CLR)的原理及scikit-bio介绍

中心对数比变换(Centered Log Ratio Transformation,CLR)是一种数据预处理方法,常用于成分数据分析领域。在成分数据中,各成分之间通常存在一定的约束关系,比如它们的和为固定值等,中心对数比变换可以有效地处理这种具有特殊约束的数据。官方文档scikit-bio是一个在Python3中处理生物数据的库成分统计 (skbio.stats.composition )模块中的,此函数将组合从Aitchison几何体转换到真实空间。这个clr。

RECORD LEARN PROGRESS 1万+

C语言内存布局

一.C程序的基本组成及产生过程 一个程序本质上都是由 BSS 段、data段、text段三个组成的。 C程序编译的完整过程:C源代码---->预编译处理(.c)---->编译、优化程序(.s、.asm)---->汇编代码(.obj、.o、.a、.ko)---->链接程序(.exe、.elf、.axf 等) 程序编译后生成的目标文件至少含有这三个段,这三个段的大致结构图如下所示:

1、测试博主技术知识分享 2、pos行业知识技术分享 3、java后端技术知识分享 4、嵌入式技术知识分享 5、运维部署相关知识分享 2007

Unity开发微信小游戏,使用Addressables管理游戏资源(本地进行远程测试)

快速构建Unity微信小游戏 使用Addressables管理游戏资源 使用小皮助手在本地进行远程资源加载测试

the_vnas的博客 6391

【C语言】【const】不同情况下,const修饰的变量存储的位置

全局const变量存储在静态存储区,可以在程序的任何地方访问。局部const变量存储在栈上,在函数调用时分配,在函数返回时释放。const修饰的字符串常量STR_CONST存储在常量存储区,在程序运行期间保持不变。总之,const修饰的变量可以存储在静态存储区、栈或常量存储区,具体取决于变量的声明位置和用途。

m0_56844552的博客 5028

Python+Vue计算机毕业设计风电场监控系统的设计与实现7bd6i(程序+LW+源码+部署)

Python3.7.7+Django+Mysql5.7+pip list+HBuilderX(Vscode也行)+Vue+Pychram社区版。2. 前端:vue+css+javascript+jQuery+easyUI+highcharts。2.IDE环境:Python和Python 社区版都可以。Django + Vue +Python+Mysql 等等组成,B/S模式等等。该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。1. 后端:Python、Vue、Django、Mysql。

华信计算机毕设源码程序 341

RTKLIB中RTK定位原理(一)

1 模型 1.1 非差观测值 非差观测值与RTKLIB中PPP定位原理——观测模型部分中一致。 1.2 单间单差观测值 若两个接收机距离较近,经过站间单差,电离层对流层延迟可消除,卫星s的钟差以及初始相位被消除,中依然包含接收机初始相位。 1.3 站间星间双差观测值 经过站间星间双差,接收机钟差及初始相位被消除。 2 EKF参数估计 2.1 EKF法则 EKF法则与RTKLIB中PPP定位原理——观测模型部分中一致。 2.2 状态变量与时间更新 (1)状态变量 在RTK...

papunzal的博客 3816

程序的内存分配,以及局部const和全局const在系统内存中的存储情况、指针感悟~

目录 一、程序的内存分配 1、1 程序的内存分布情况 例子程序: 二、局部const和全局const在系统内存中的存储情况 例子程序 逐个讲解 一、程序的内存分配 1、1 程序的内存分布情况 ---------------- 高地址 eg:0x405000 栈区 ① ---------------- 堆区 ② ---------------- 全局量(静态量) ③ ---------------- eg:...

ah_yl的博客 1359

智能车竞赛卡丁快跑组:自动驾驶与人车交互技术实战解析

本文深入解析了智能车竞赛卡丁快跑组的技术核心,重点探讨了自动驾驶与人车交互两大模块的实战方案。文章详细拆解了从环境感知、路径规划到语音识别、命令执行的完整流程,并分享了基于单片机平台的调试心法与赛场经验,为参赛者提供了一套从零开始、分步攻坚的系统性备赛指南。

f0g1h2的博客 1177

const 变量的存储位置

const 变量的存储位置 在C语言和C++中const 全局变量都是存储在只读数据区(.rodata),但是是有条件的,在编译期最初都是将其存储在符号表中。 (1)C语言的const全局变量只有在第一次被使用时才会在只读数据区分配内存空间存储。 (2)C++中的const全局变量是否分配内存空间存储取决于它的用途,如果是充当一个值替换(将一个变量名替换为一个值),那么它是不分配内存空间的。当对这个const全局变量取地址或者使用extern时,就会分配内存空间存储。 空间的释放的时机遵循只读数据段内存释放

zl_1719828096的博客 6178

保姆级教程:用MediaPipe和BlazePose在Python里实时追踪你的健身动作(附完整代码)

本文提供了一份详细的Python教程,教你如何使用MediaPipe和BlazePose实现实时健身动作追踪。从环境配置、模型选型到实时视频流处理架构设计,再到健身动作量化分析和可视化反馈系统优化,教程涵盖了完整的实现步骤和代码示例,帮助开发者快速构建高效的姿态特征点检测系统。

weixin_42531779的博客 153

ZW3D 二次开发-制作插件

1.Windows 7 SP1 或 Windows 10 或 Windows 11(推荐 Windows 11)2.Visual studio 2017-2022 (或 C/C++的任何其他集成开发环境)(推荐 Visual studio 2022)3.ZW3D 2023 或以上版本(建议使用与 ZW3D 一致的 API 的版本)4.Qt5.9.7(for Windows)博主学习使用环境的是:Windows 11 Version 24H2 + Visual studio 2022 + Qt5.9.7(fo

fhqiwmc的博客 811

C++:const常量的存储位置

前言: 今日看cpp的内存管理这块,偶然想到加关键字const修饰的变量位于哪块内存区?遂在网上一顿搜索和群里与大神交流,得出以下结论。 结论: 1、const修饰的量不是常量,仅仅是个只读量 ...

algsup 2万+

【NLP】第十章:位置编码Positional Encoding

前面讲RNN时一般都会有一个ht的输出,这个输出就是样本与样本之间的信息,而且RNN是时序循环的,所以RNN本身的结构,在物理上,就自带词的前后顺序信息的。比如词never,不管never本身的词向量是什么,只要你在序列中排第一个位置,你的位置向量就是[0,1,01],你排第三个位置,你的位置向量就是[0.9,-0,4,0.2,1.0]。也所以,你可以理解为:embedding后的词嵌入,PE按照每个样本在sequence中的位置,把embedding后的词嵌入给扭转后,才送入attention的。

因为热爱所以坚持 1918

const、static型数据在内存中如何存储?(变量存放位置)

const、static型数据在内存中如何存储?(变量存放位置) static int val_a = 1 ; // 初始化的静态变量 int val_b = 2 ; // 全局变量 const int val_c = 3 ; // const 全局变量 static int val_d ; // 未初始化的静态变量 int val_e ;......

魏波 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

NTscan扫描工具

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

图解AUTOSAR_CP_CompilerAbstraction:从宏定义到跨平台编译实战

本文详细解析AUTOSAR编译器抽象层(CompilerAbstraction)的核心机制与实战应用。通过图解方式阐述宏定义原理、内存模型配置及跨编译器适配策略,帮助汽车电子开发者解决代码移植难题,提升跨平台开发效率30%以上。重点涵盖16/32位微控制器的寻址优化与内存管理最佳实践。

ice55的博客 186

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

25万+字干货|Java面试85题图解版:43道高频真题速查手册(八股+源码双吃透)

本文为25万字超全干货的Java面试85题图解完整版手册,精选43道大厂高频面试真题,摒弃传统死记硬背八股文模式,采用三句标准答案、生活化场景比喻、核心结构图解的方式,通俗讲解Java基础、并发、JVM、数据库、框架等核心考点。每道题目配套实战避坑指南、面试官高频追问与源码解析,实现八股背诵与底层源码双向吃透,适合校招、社招程序员考前速刷、长期复盘,轻松攻克Java面试重难点。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 795

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

RPMsg(实现A7-M4通信)

define VRING_SIZE 256 // 队列长度: 256 项#define RPMSG_BUF_SIZE 512 // 单个 Buffer 大小: 512 字节#define RPMSG_HEADER_SIZE 16 // RPMsg 报头: 16 字节#define RPMSG_PAYLOAD_SIZE (RPMSG_BUF_SIZE - RPMSG_HEADER_SIZE) // 496 字节。

wangzhaoyang2828的博客 350

【Java入门到精通】*基础篇

Java入门教程摘要(1-6期) 本系列从零讲解Java,基于Java 8 LTS版本。 Java历史与特性:1995年Sun公司发布,以跨平台、面向对象为核心优势,应用于后端、安卓、大数据等领域。 跨平台原理:通过JVM将字节码转换为机器码,实现"一次编写,到处运行"。 环境组件:JDK(开发工具包)⊃ JRE(运行环境)⊃ JVM(虚拟机),开发需安装JDK。 安装配置:提供Windows/Mac的JDK安装指南,强调路径无中文/空格。 环境变量:设置JAVA_HOME指向JDK路径,Path添加bin

2301_81248642的博客 931

Windows API 函数

《Windows API函数手册》摘要 本文档是Windows平台开发的权威参考手册,全面收录774个核心API函数,涵盖系统管理、进程线程、窗口消息、文件操作、图形处理等12大功能模块。手册采用结构化编排,主要特点包括: 编码规范 详细区分多字节(char)与宽字符(wchar_t)编码体系 提供LPSTR/LPCWSTR等字符串指针类型的完整解析 说明UTF-8与GBK编码转换的实际应用场景 核心功能模块 窗口创建:完整展示从注册类到消息循环的窗口生命周期 文件操作:覆盖CreateFile/ReadF

gqk01的博客 862

AutoSar架构下主机厂实战应用层+底层问题+代码+原理+拓展知识点分享(持续更新..)

具体内容提到了宏定义、Std_Types.h、Infineon等。本文分享了C代码规范及AutoSar架构中的BUG案例,重点讲解宏定义写法(如#define X (0u))及Infineon AURIX2G平台Std_Types.h头文件的实现细节,并结合实际项目说明规范应用与常见错误。

weixin_45479529的博客 639

手工香薰蜡烛材料包电商应用过 alignContent 参数控制对齐方式;Column 将子元素沿主轴(垂直方向)依次排列,通过 space 参数控制子元素间距;Row 则沿水平方向排列子元素

在移动互联网与智能穿戴设备高度普及的今天,"习惯养成"已经从一个模糊的自我管理理念,演变为一个可量化、可追踪、可视化的数字化产品赛道。越来越多的人希望借助手中的智能终端,把"早起、冥想、阅读、运动"这些抽象的自律行为,转化为一条条清晰的数据曲线和一张张可触摸的打卡卡片。而鸿蒙生态(HarmonyOS)凭借其跨设备协同、分布式软总线以及声明式 UI 开发框架 ArkUI,为这类注重"轻量化交互 + 即时反馈"的生活方式类应用提供了极为理想的生长土壤。本应用正是一款面向"晨间场景"深度打磨的习惯追踪工具。它聚焦

jin421352的博客 64

STM32寄存器

问题 什么是寄存器? 什么是存储器映射? 什么是寄存器映射? STM32架构 程序存放在FLASH中。const的常量存放在FLASH中,变量(全局、静态变量)存放在SRAM中。 System总线主要读取寄存器。 AHB(高速)总线上挂着SDIO、复位和始终控制RCC,通过桥接又分出APB1(低速总线)和APB2(高速总线),两条总线分别挂着一些外设 FSMC用于驱动液晶屏 学习重点是AHB1、2上的外设 存储器映射   存储器本身不具有地址信息,给存储器分配地址的过程就成为存储器映射,再分配一个地址

Giii1的博客 834

【知识盲区】const修饰的变量的存储位置

c语言中const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放。 而const局部变量(局部变量就是在函数中定义的一个const变量,)存储在栈中,代码块结束时释放。 在c语言中可以通过指针对const局部变量进行修改,而不可以对const全局变量进行修改。因为const全局变量是存储在只读数据段 而c++中,一个const不是必需创建内存空间,而在c中,一个const总是需要一块内存空间。 在c++中是否要为const全局变量分配内存空间,取决

ddiioopp123的博客 1902

【STM32】const 变量存储学习笔记

【代码】【STM32】const 变量存储学习笔记。

qq_42737210的博客 921

golang 基础知识

GO 命令 go build 只对main包下的文件有效 在当前目录下生成可执行文件 使用 -o 参数显式指定路径和文件名 默认作用范围为当前文件夹,编译单个文件需指定文件名 go install 编译和安装文件 main包文件安装到bin文件夹(.exe) 普通包文件安装到pkg/$GOOS文件夹(.a) go run 编译和执行程序,不生成文件 go get ......

firefly 1117

c语言程序的存储区域与const关键字的使用方法

一.C语言程序的存储区域 1.由C语言代码(文本文件)形成可执行程序(二进制文件),需要经过编译-汇编-连接三个阶段。编译过程把C语言文本文件生成汇编程序,汇编过程把汇编程序形成二进制机器代码,连接过程则将各个源文件生成的二进制机器代码文件组合成一个文件。 2.C语言编写的程序经过编译-连接后,将形成一个统一文件,它由几个部分组成。在程序运行时又会产生其他几个部分,各个部分代表了不同的存储区域: ...

小白编程 478
上一篇: 【C语言二叉树镜像反转实战】:掌握高效递归与非递归实现技巧
下一篇: 如何精准控制时间序列频率?Pandas重采样十大应用场景
SimProceed
博客等级 码龄1年 146粉丝 2011原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值