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

news2025/1/17 15:44:01

目录

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; // 输出 42
    std::cout << "obj2.staticVar: " << obj2.staticVar << std::endl; // 输出 42

    // 访问非静态成员变量,它在每个对象中有一个单独的实例
    obj1.nonStaticVar = 5;
    obj2.nonStaticVar = 10;
    std::cout << "obj1.nonStaticVar: " << obj1.nonStaticVar << std::endl; // 输出 5
    std::cout << "obj2.nonStaticVar: " << obj2.nonStaticVar << std::endl; // 输出 10

    return 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.coloradmin.cn/o/1628229.html

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

相关文章

Compose和Android View相互使用

文章目录 Compose和Android View相互使用在Compose中使用View概述简单控件复杂控件嵌入XML布局 在View中使用Compose概述在Activity中使用Compose在Fragment中使用Compose布局使用多个ComposeView 在布局中使用Compose 组合使用 Compose和Android View相互使用 在Compose中使用…

web自动化系列-selenium的下拉框定位(十三)

在功能操作过程中 &#xff0c;遇到下拉列表是很正常的事 &#xff0c;比如像一些查询条件就都是使用的是下来列表 。所以 &#xff0c;selenium也需要支持对下拉框的操作 。 1.下拉列表 在selenium中&#xff0c;也提供了一个下拉列表操作的类 &#xff1a;Select . 以下为该…

C语言学习/复习35

一、语言文件操作 1.章节重点 注意事项1&#xff1a;可变参数 、

使用NGINX做局域网内 浏览器直接访问链接 拓展外网链接访问本地

达成目的功能&#xff1a; 在本地服务的一个文件路径下&#xff0c;局域网内用ip和路径名访问到对应的地址&#xff1b;如 10.5.9.0/v1 即可访问到 某个固定本地地址目录 V1下&#xff0c;名为index.html的文件。前言 NGINX 是一个非常流行的开源 Web 服务器和反向代理服务器…

【踩坑日记】SpringBoot集成Kafka,消息没有按照顺序消息问题【已解决】

背景 作为一个合格的码农&#xff0c;当然要学会CV大法了&#xff0c;可是CV也是有风险的&#xff0c;别以为前任写的已经上线那么久了没有问题… 我们需要将埋点信息上报到一个三方平台&#xff08;S2S&#xff09;接口&#xff0c;三方平台对时间有要求&#xff0c;同一个用…

【工具】-根源上解决VScode打印输出乱码的问题

目录 1 第一步&#xff1a; 改编译命令&#xff0c;保持一致2 第二步&#xff1a; 更改VScode的编码格式-保持一致 1 第一步&#xff1a; 改编译命令&#xff0c;保持一致 看一下你的控制台的编译的命名后缀&#xff0c;有两个关键的参数&#xff0c;如下图&#xff1a; “-f…

预测性营销在业务经营中的实践:开源AI名片商城系统小程序的应用与实例

在数字化浪潮中&#xff0c;预测性营销已经成为企业获取市场竞争优势、推动业务增长的关键手段。而开源AI名片商城系统小程序&#xff0c;作为一种融合了先进技术和智能分析能力的工具&#xff0c;为企业在业务经营中实现预测性营销提供了有力支持。 首先&#xff0c;让我们通过…

神经网络中多层卷积的作用

在神经网络中采用多层卷积的目的是为了逐步提取和组合图像的抽象特征&#xff0c;从而更有效地学习数据的表示并执行复杂的任务。不同层的卷积具有不同的作用&#xff0c;从较低层次的特征&#xff08;例如边缘、纹理&#xff09;到较高层次的抽象特征&#xff08;例如物体部件…

怎么做视频二维码更方便?在线一键生成视频活码二维码

现在经常会发现很多的二维码可以用来展示视频内容&#xff0c;通过这种方式来实现视频的快速分享与传播。二维码是一种成本低传播快的内容传播方式&#xff0c;很多的内容都可以通过生成二维码的方式来分享给其他人&#xff0c;可以同时扫描相同的二维码来获取内容&#xff0c;…

企业进行数字化转型需要具备哪些基础条件?

蚓链实践——企业进行数字化转型通常需要具备以下基础条件&#xff1a; 1. 管理层的支持&#xff1a;高层管理者对数字化转型的理解和支持至关重要。 2. 明确的战略目标&#xff1a;确定数字化转型的目标&#xff0c;以指导决策和资源分配。 3. 数据基础&#xff1a;拥有良好…

【MySQL】MySQL中MVCC多版本并发控制的概念

MySQL中MVCC多版本并发控制的概念 锁相关的知识我们已经学习完了&#xff0c;在其中我们提到过一个概念&#xff0c;那就是 MVCC 。这又是个什么东西呢&#xff1f;今天我们就来好好看看 MVCC 到底是干嘛的。 MVCC 多版本并发控制&#xff0c;它主要是控制 读 操作&#xff0c;…

【Java系列】SpringCloudAlibaba 实现在不修改配置文件情况下适配不同环境部署

本文将向大家介绍在SpringCloudAlibaba微服务架构中&#xff0c;如何实现多个微服务在不修改各自配置文件的情况下适配不同环境进行部署。 作者&#xff1a;后端小肥肠 1. 前言 在现代软件开发过程中&#xff0c;随着敏捷开发和持续集成的普及&#xff0c;开发团队越来越需要在…

Linux c++ onvif客户端开发(8):GetServices

本文是Linux c onvif客户端开发系列文章之一&#xff1a; Linux c onvif客户端开发(1): 根据wsdl生成cpp源文件Linux c onvif客户端开发(2): 获取摄像头H264/H265 RTSP地址Linux c onvif客户端开发(3): 扫描设备Linux c onvif客户端开发(4): 扫描某个设备是否支持onvifLinux c…

2021 年全国职业院校技能大赛高职组“信息安全管理与评估”赛项 A 卷 第二阶段任务书

第二阶段任务书 一、赛项第二阶段时间180 分钟。 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu5488233 三、注意事项 赛题第二阶段请…

BUUCTF--web(1)

1、[极客大挑战 2019]Http1 1.http报文请求&#xff1a; 1、请求行&#xff1a; 第一部分是请求方法&#xff0c;常见包括GET、POST、OPTIONS&#xff08;我目前还没有见过我是菜鸡&#xff09; 第二部分是url 第三部分是HTTP协议(http(Hypertext transfer protocol)超文本传…

CMakeLists.txt中如何添加编译选项?

1. 引子 编译器有多种可供选择&#xff0c;如g、c、clang等&#xff0c;如下以c作为示例。 2. 使用CMAKE_CXX_FLAGS添加编译选项 在Makefile中可能用类似如下的指令来添加编译选项&#xff1a; /usr/bin/c -Wall -Wextra -Wno-sign-compare -Wno-unused-variable -Wno-unuse…

网络基础(day3)

【 理论重点】 网络是什么&#xff1f; &#xff08;网络是载体&#xff0c;目的是传输互联网中的数据&#xff0c;数据是终端产生<手机、电脑、服务器等>。&#xff09; 如何组件网络&#xff08;良性网络架构&#xff09;&#xff1f;有网络架构思维&#xff0c;得按层…

C 函数递归

目录 什么是递归 递归的限制条件 递归的例子 1、用递归求n的阶乘 递归扩展学习 1、青蛙跳台阶 思路 代码实现 2、汉诺塔问题​ 思路 代码实现 总结 什么是递归 递归&#xff1a;“递推” “回归” 在C语言中&#xff0c;函数递归就是&#xff1a;函数自己调用自…

【docker】安装openjdk

查看可用的 openjdk版本 docker hub 查看地址&#xff1a;https://hub.docker.com/_/openjdk 此图片已被正式弃用&#xff0c;建议所有用户尽快找到并使用合适的替代品。其他官方形象替代品的一些例子&#xff08;按字母顺序列出&#xff0c;没有有意或暗示的偏好&#xff09;…

Python语言在地球科学交叉领域中的应用

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;Python能够运行在Linux、Windows、Macintosh、AIX操作系统上及不同平台&#xff08;x86和arm&#xff09;&#xff0c;Python简洁的语法和对动态输入的支持&#xff0c;再加上解释性语言的本质&…