Vitis HLS 学习笔记--C/C++ static 关键字的作用

目录

1. 简介

2. c/c++共有性质

3. c++独有性质

4. 示例说明

5. static 对于 HLS 工具的影响

6. 总结


1. 简介

在Vitis HLS中,偶尔会用到 static 关键字。考虑到Vitis HLS同时兼容C和C++语言,有必要理解这两种语言中static关键字细微差异。本文旨在梳理和总结C与C++中static关键字的具体差别,以便于开发者更加精确地应用于Vitis HLS环境中。

2. c/c++共有性质

  • static 修饰全局变量

表明一个全局变量只对定义在同一文件中的函数可见。

全局变量的作用域被限制在定义它的文件内,这意味着该全局变量只能被同一源文件中的函数访问。

  • static 修饰局部变量

表明该变量的值不会因为函数终止而丢失。

局部变量的生命周期变为整个程序执行期间,但其作用域不变,仍然只在定义它的函数内。

这种特性使得static局部变量适合于实现需要记录之前状态或结果的功能,例如,用于计数函数被调用的次数。

  • static 修饰函数

表明该函数只在同一文件中调用。

函数的作用域被限制在其定义的文件中,这与 static 全局变量的行为是一致的。

3. c++独有性质

  • 修饰类的数据成员

表明对该类所有对象这个数据成员都只有一个实例。即该实例归所有对象共有。

  • 用static修饰不访问非静态数据成员的类成员函数。

这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局变量。


如果不使用static关键词修饰函数或变量,它们就具有全局可见性,可以在其他文件中使用。在C++中,未被static关键词修饰的函数和变量都具有外部链接(external linkage),这意味着它们可以被其他文件引用。需要注意的是,如果在多个文件中定义了同名的全局函数或变量,编译器会报“multiple definition”错误。在这种情况下,可以将这些函数或变量定义为static,或者使用命名空间(namespace)来避免命名冲突。

4. 示例说明

Vitis-HLS-Introductory-Examples/Vitis/single_kernel/vadd_kernel/krnl_vadd.cpp at master · Xilinx/Vitis-HLS-Introductory-Examples · GitHubContribute to Xilinx/Vitis-HLS-Introductory-Examples development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/Xilinx/Vitis-HLS-Introductory-Examples/blob/master/Vitis/single_kernel/vadd_kernel/krnl_vadd.cpp

链接所示例子中,以下三个函数都static修饰,都只能在本文件中调用:

static void read_input(uint32_t* in, hls::stream<uint32_t>& inStream, int vSize)static void compute_add(hls::stream<uint32_t>& inStream1,...)static void write_result(uint32_t* out, hls::stream<uint32_t>& outStream, int vSize)

以下函数调用了上面三个函数,此函数在头文件中被申明,属于被别的文件调用,那么不能使用static修饰

void krnl_vadd(uint32_t* in1, uint32_t* in2, uint32_t* out, int vSize)

静态成员是类或结构体的成员,它们在整个程序执行期间都只有一个实例。

换句话说,静态成员在所有对象之间共享。这与非静态成员不同,非静态成员在每个对象中都有一个单独的实例。静态成员可以是变量或者函数。例如,定义如下类:

class MyClass {
public:// 静态成员变量static int staticVar;// 非静态成员变量int nonStaticVar;// 静态成员函数static void staticFunction() {// 静态成员函数可以访问静态成员变量,但不能访问非静态成员变量staticVar = 10;}// 非静态成员函数void nonStaticFunction() {// 非静态成员函数可以访问这两者:// 静态成员变量和非静态成员变量staticVar = 15;nonStaticVar = 20;}
};
// 静态成员变量需要在类外进行定义和初始化
int MyClass::staticVar = 0;int main() {MyClass obj1, obj2;MyClass::staticVar = 42; // 访问静态成员变量,它在所有对象之间共享std::cout << "obj1.staticVar: " << obj1.staticVar << std::endl; // 输出 42std::cout << "obj2.staticVar: " << obj2.staticVar << std::endl; // 输出 42// 访问非静态成员变量,它在每个对象中有一个单独的实例obj1.nonStaticVar = 5;obj2.nonStaticVar = 10;std::cout << "obj1.nonStaticVar: " << obj1.nonStaticVar << std::endl; // 输出 5std::cout << "obj2.nonStaticVar: " << obj2.nonStaticVar << std::endl; // 输出 10return 0; }

要点:

  • staticVar 是一个静态成员变量,它在所有 MyClass 对象之间共享。
  • nonStaticVar 是一个非静态成员变量,它在每个对象中都有一个单独的实例。
  • 静态成员函数 staticFunction() 只能访问静态成员变量,而非静态成员函数 nonStaticFunction() 可以访问静态成员变量和非静态成员变量。

5. static 对于 HLS 工具的影响

使用HLS工具进行综合时,输入和输出端口可以映射到实际的硬件接口,例如AXI接口。对于HLS中的数据流(stream)类型,数据可以通过FIFODMA等硬件模块进行传输。在综合过程中,这些数据流通常会被映射到FIFODMA硬件模块,并在硬件设计中使用。

尽管 inStream1 是一个在 HLS C++ 代码中定义的变量,但在硬件设计中,它可能被映射到一个FIFODMA硬件模块。在这种情况下,static 关键词的作用仅仅是限制变量的作用域,以避免与其他变量发生命名冲突。实际上,inStream1 的状态和值在运行时存储在FIFODMA中,而不是存储在静态内存中。

因此,在使用HLS工具进行硬件设计时,static关键词的作用主要是限制变量的作用域,而不是控制变量的存储方式。

6. 总结

本文通过具体实例探讨了C与C++中static关键字的使用差异,并针对其在Vitis HLS环境中的应用进行了详细梳理。尽管static在两种语言中都被广泛使用,但其在作用域管理、变量持久性以及对函数和变量的可见性方面的具体表现形式存在细微差别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/3798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux cmake 初窥【1】

1.开发背景 linux 下编译程序需要用到对应的 Makefile&#xff0c;用于编译应用程序&#xff0c;但是 Makefile 的语法过于繁杂&#xff0c;甚至有些反人类&#xff0c;所以这里引用了cmake&#xff0c;cmake 其中一个主要功能就是用于生成 Makefile&#xff0c;cmake 的语法更…

AIGC:开启内容创作新纪元,我们如何看待它的影响与前景?

AIGC的概念 AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;的概念主要是指人工智能生成内容。 这是一种新的人工智能技术&#xff0c;它利用人工智能模型&#xff0c;根据给定的主题、关键词、格式、风格等条件&#xff0c;自动生成各种类型的文本、图…

Maya vs Blender:制作3D动画首选哪一个?

就 3D 动画而言&#xff0c;有两款3D软件引发了最多的争论&#xff1a;Blender 与 Maya。这两个强大的平台都提供强大的工具集&#xff0c;使动画故事和角色栩栩如生。但作为一名3D动画师&#xff0c;您应该投入时间学习和创作哪一个呢&#xff1f;下面我将从以下六点给您一个清…

SQL优化——全自动SQL审核

文章目录 1、抓出外键没创建索引的表2、抓出需要收集直方图的列3、抓出必须创建索引的列4、抓出SELECT * 的SQL5、抓出有标量子查询的SQL6、抓出带有自定义函数的SQL7、抓出表被多次反复调用SQL8、抓出走了FILTER的SQL9、抓出返回行数较多的嵌套循环SQL10、抓出NL被驱动表走了全…

关于豆瓣电影数据抓取以及可视化

首先我们可以先了解以下网络爬虫的定义&#xff1a; 爬虫是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。它可以在互联网上自动抓取网页内容&#xff0c;将这些信息存储起来。爬虫可以抓取网站的所有网页&#xff0c;从而获取对于我们有价值的信…

企业战略落地:单项目无法解决的,交给项目组合管理

在快速变化的市场环境中&#xff0c;企业对项目管理的需求日益增加&#xff0c;但传统的单项目管理和项目集管理难以满足企业对项目管理的更高要求。随后&#xff0c;项目组合管理方法论逐渐被越来越多的企业运用&#xff0c;并用于指导企业在复杂多变的经营环境下&#xff0c;…

JVM(Jvm如何管理空间?对象如何存储、管理?)

Jvm如何管理空间&#xff08;Java运行时数据区域与分配空间的方式&#xff09; ⭐运行时数据区域 程序计数器 程序计数器&#xff08;PC&#xff09;&#xff0c;是一块较小的内存空。它可以看作是当前线程所执行的字节码的行号指示器。Java虚拟机的多线程是通过时间片轮转调…

《HCIP-openEuler实验指导手册》1.5 Apache持久化连接配置

一、知识点 二、配置方法 在/etc/httpd/conf.d目录中创建持久连接相关配置文件keepalived.conf&#xff0c;并添加如下配置信息&#xff1a; KeepAlive On KeepAliveTimeout 20 MaxKeepAliveRequests 500

目标检测——大规模商品数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

【STM32F407+CUBEMX+FreeRTOS+lwIP之TCP记录】

STM32F407CUBEMXFreeRTOSlwIP之TCP记录 注意TCP client(socket)示例 TCP_server(socket)效果 注意 如果连接失败&#xff0c;建议关一下代理软件。 配置方面可以参考一下上一篇UDP的文章 STM32F407CUBEMXFreeRTOSlwIP之UDP记录 TCP client(socket) #define LWIP_DEMO_PORT 8…

OpenSceneGraph

文章目录 关于 OpenSceneGraphScreenshots - OpenMW 关于 OpenSceneGraph 官网&#xff1a;https://openscenegraph.github.io/openscenegraph.io/github : https://github.com/openscenegraph/OpenSceneGraphClasses : https://podsvirov.github.io/osg/reference/opensceneg…

小清新DP题(多做多想)

牛客小白月赛90 F problem solution R(n), R(m); int L 0;F(i, 1, m) R(d[i].st), R(d[i].en), c[ L] d[i].st, c[ L] d[i].en;c[ L] n;sort(c 1, c L 1); int cnt 0;F(i, 1, L) if (c[i] ! c[i - 1]) {g[c[i]] cnt;D[cnt] c[i];}sort(d 1, d m 1);f[0][0][0] …

ElasticSearch 安装(docker)

下载安装包 阿里云链接&#xff1a; elasticSearch.exe https://www.alipan.com/s/3A356NnmWaJ 提取码: 93da 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&#xff0c;视频原画倍速播放。 安装步骤 1、首先…

冯唐成事心法笔记 —— 知人

系列文章目录 冯唐成事心法笔记 —— 知己 冯唐成事心法笔记 —— 知人 冯唐成事心法笔记 —— 知世 冯唐成事心法笔记 —— 知智慧 文章目录 系列文章目录PART 2 知人 人人都该懂战略人人都该懂战略第一&#xff0c;什么是战略第二&#xff0c;为什么要做战略第三&#xff0…

GPB | RegVar:基于深度神经网络的非编码区突变功能预测新方法

Genomics, Proteomics & Bioinformatics &#xff08;GPB&#xff09;发表了由军事医学研究院辐射医学研究所张成岗研究员、周钢桥研究员和卢一鸣副研究员团队完成的题为“RegVar: Tissue-specific Prioritization of Noncoding Regulatory Variants”的方法文章。我们的“…

Docker torchserve 部署模型流程——以WSL部署YOLO-FaceV2为例

Docker torchserve 部署模型流程——以WSL部署YOLO-FaceV2为例 Docker torchserve 模型部署 一、配置WSL安装docker二、配置docker环境1&#xff0c;拉取官方镜像2&#xff0c;启动docker容器&#xff0c;将本地路径映射到docker3&#xff0c;查看docker镜像4&#xff0c;进入…

Redis入门到实战教程(基础篇)笔记

教学来源&#xff1a; Redis课程介绍导学_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1cr4y1671t?p1一、Redis 入门 1.认识NoSQL 2.Redis在虚拟机中的安装和开机自启 Redis在虚拟机中安装和配置开机自启-CSDN博客https://blog.csdn.net/qq_69183322/article/deta…

项目管理中常用的三个工具:甘特图、看板、燃尽图

在日常项目管理的实践中&#xff0c;为了更有效地追踪项目进度、优化资源配置和提高团队协作效率&#xff0c;管理者常常会借助一些工具来辅助工作。这些工具的本质在于将抽象复杂的项目管理任务具象化、简单化&#xff0c;以更直观、方便的方式呈现出来。 以下介绍项目管理中…

2024.4.28 机器学习周报

目录 引言 Abstract 文献阅读 1、题目 2、引言 3、创新点 4、总体流程 5、网络结构 5.1、损失函数 5.2、Confidence Maps 5.3、Part Affinity Fields(PAFs) 5.4、多人的PAFs 6、实验 7、结论 深度学习 yolov8实现目标检测和人体姿态估计 Yolov8网络结构 yaml…

el-input-number 只能输入整数,最小值1,最大值5

<el-form-item label"排序" prop"name" > <el-input-number v-model"form.sort" placeholder"请输入唯一排序" :min1 :max"5" :precision"0" class"custom-input-number" /> </el-form-…