va_list可变参数的秘密

Fedproto:原型聚合的联邦学习框架 文中说明,联邦学习通过计算传递梯度聚合模型时,客户端之间的异构性通常会阻碍模型优化收敛和泛化性能。故本文提出新的FedProto框架,将梯度替换成为原型,通过计算、聚合从不同客户端收集到的本地原型,然后将全局原型发送回所有客户端,以规范本地模型的训练。对每个客户机进行局部训练的目的是最小化对本地数据的分类损失,同时保持生成的本地原型足够接近相应的全局原型(损失函数最小+正则)。什么是原型?文中提到:“ 阅读详情

va_list可变参数的秘密

在这里插入图片描述


我们知道在 c++里面,如果无法确认传入的参数个数以及类型的时候,那么可以使用 省略号来指定参数列表

比如

void fun1(int a, ...)
void fun2(...)

其中比较典型的就是printf函数

printf (const char *__restrict __fmt, …)

调用

printf(“ssss %d”,10)

那么其函数内部实现的是如何的

值得注意的是

  • \1. 变参处的定义或声明, 用 … 代替参数类型.
  • \2. 变参 … 只能放在参数列表最末尾.

内部实现原理

其实其内部的机制就是val_list

val_list在stdarg.h头文件

type va_arg(
   va_list arg_ptr,
   type 
);
void va_end(
   va_list arg_ptr 
);
void va_start(
   va_list arg_ptr,
   prev_param 
);

其中type是指定回去参数的类型. arg_ptr是指向参数列表的指针. pre_param是指向最后一个显示声明的参数,用来回去第一个变长参数的位置

使用步骤

a)定义一个va_list类型的变量,变量是指向参数的指针。

b)va_start初始化刚定义的变量,第二个参数是最后一个显式声明的参数(也就是...之前的参数)。

c)va_arg返回变长参数的值,第二个参数是该变长参数的类型。

d)va_end将a)定义的变量重置为NULL。

具体的含义是

val_list定义一个变量列表的指针类型

va_start是将va_list对象绑定到有n个变量的传入参数列表上

va_arg是从参数列表中逐个去除数据,取出数据的类型有type决定,返回type类型的值.并且使得agv_ptr指向参数列表中的下一个参数.

当函数结束的时候调用va_end来清除va_list指向的空间,不然会发生内存泄露

所以必须知道传入参数的个数不然va_start无法绑定

例子

#include <stdarg.h>
#include <stdio.h>

void myprint(const char* format, ...) {
  va_list va;
  va_start(va, format);
  char ch;
  while (ch = *format++) {
    if (ch == '%') {
      ch = *format++;
      if (ch == 's') {
        char* ss = va_arg(va, char*);
        while (*ss) {
          putchar(*ss++);
        }
      } else if (ch == 'd') {
        putchar(va_arg(va, int) + '0');
      }
    } else {
      putchar(ch);
    }
  }
  va_end(va);
}

int main() { myprint("hello world %s years %d\n", "!!!", 9); }
单细胞RNA测序数据分析与可视化:从基础原理到高级应用 单细胞RNA测序(scRNA-seq)技术通过解析单个细胞的基因表达谱,显著提升了我们对细胞异质性的理解。本文详细介绍了scRNA-seq数据分析的完整流程,包括数据预处理、质量控制、降维、聚类、差异表达分析、细胞类型注释、细胞周期分析、轨迹分析、RNA速率分析、基因集富集分析、细胞通讯分析、批次效应校正以及空间转录组学整合。文章还展示了scrna_toolkit包在简化分析流程和增强数据可视化方面的应用。通过这一工具,研究者可以更高效地处理单细胞数据,揭示复杂的生物学信息。未来,该工具将进一步整合多组学分 阅读详情

相关推荐

晶振(晶体振荡器)测试方法详解

晶振测试方法分为无源和有源两种类型。无源晶振(两脚)需用示波器测试波形,重点关注正弦波形状、200mV-1.5Vpp幅值和频率精度;有源晶振(四脚)通电后直接输出方波。测试要点包括:示波器使用10X探头、AC耦合,带宽需5倍于晶振频率;万用表可初筛短路/开路;替换法是工程最有效方法。常见故障排查顺序:供电→复位→焊接→型号→负载电容→波形观察→更换晶振→MCU配置。负载电容需按公式计算匹配,示波器观察是核心测试手段。

jiujiujinyuxi的博客 926

valist的使用方法(队可变参数的处理)

valist的使用方法(队可变参数的处理)

yanzhe1的博客 2438

[V-10]ARMv8/v9-CPU Virtualization-CPU虚拟化架构简介(vCPU/vPE)

本文简要介绍了CPU虚拟化架构的基础知识。

基层架构师的分享 1267

Scala学习笔记一

Scala学习笔记一第六步:for和foreachjava中循环数组输出:for(i=0;i<str.length,;i++){ println(str[i]); } scala中循环数组输出:for(i<-str){ println(str(i)) } 注意:scala的for中的i是val,虽然每次都被赋予了新值,但是每次循环时都是new一个新的对象,只是每次new的对象的名字

jsy625的专栏 1361

【即插即用模块】Transformer篇 | CVPR 2025 | SADA:多尺度+可变形采样,完美替换自注意力实现涨点!

文章摘要 本文提出了一种尺度自适应可变形注意力模块(SADA),用于处理图像修复中的结构化伪影问题。SADA通过多尺度多头机制捕获远程依赖关系,并引入可变形采样偏移来有效处理非均匀空间分布的模式。该模块适用于底层视觉任务,可替代ViT自注意力,实验证明能显著提升性能。代码已开源,支持即插即用集成。 核心特点: 多尺度头适应不同大小的重复模式 可变形偏移优化非均匀分布采样 轻量级设计,易于集成到现有架构 适用场景:图像去噪、超分辨率等底层视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1431

AutoSAR系列讲解(深入篇)14.7-Mcal Adc配置(上)

详细讲解了ADC的各个配置项的作用

雪云飞星的博客 1万+

VA_LIST可变参数列表使用学习

VA_LIST可变参数列表使用学习

Eng_ingLi的博客 839

基于 Vivado HLS 的 AC97 音频系统设计

介绍一种基于 FPGA 的 AC97 音频系统设计。系统的核心部件采用 Xilinx Atlys 的板载 Spartan6 XCSLX45 芯片,使用的工具为 Xilinx 的高层 次 综 合 技 术 Vivado HLS。首先使用 C /C + + 代码编写的算法描述系统的 FIR 滤波器; 然后按 照 Vivado HLS 编译工具的规范,将程序代码转换为 RTL 模型,快速、直接地生成对 应左右声道的 FIR IP 核和综合结果; 再结合互连的 MicroBlaze 处理器 IP 核,处理 一段立体声

qq_43416206的博客 327

Kotlin 的 val list: ArrayList<String>= ArrayList() 居然报错!

1 语法错误?也许看了我们的题目,大家还没有明白过来到底发生了什么,那么我请大家再仔细看看:val list: ArrayList<String>= Arra...

Kotlin中文社区 6051

Android Framework AMS面试题及参考答案

比如,应用 B 的 Activity 如果是 “singleTask” 启动模式,AMS 会查找应用 B 是否有包含该 Activity 的任务栈,若有则将这个任务栈切换到前台,并且清除该 Activity 之上的其他 Activity,实现流畅的跨应用跳转体验。如果一个 Activity 的启动依赖于另一个 Activity 的结果,AMS 会暂停当前 Activity 的部分生命周期操作,等待依赖的 Activity 完成相关操作后,再继续当前 Activity 的生命周期进程。

大模型大数据攻城狮的专栏 1862

AutoSAR配置与实践(实践篇)11.1 如何通过IPDU分组控制报文收发

注意这个新增的action其实是一个用户回调函数,在函数中进行配置字的判断,即可完成用户条件的判断(TRUE/FALSE),注意用户条件是用户封装的函数,用于输入给后续的逻辑判断和rule。进行PDU的拆分后,根据配置字可以选择PDU是否使能了。PDU组拆分后可分为常规PDU组和可配PDU组(新增),诊断一方面按原有逻辑控制常规PDU组,另一方面控制新的可配PDU组。举例说明,诊断场景:使能,配置字满足,则用户条件为TURE,表示期望使能可配PDU组(诊断禁止服务场景类似方式,在此不再列举)。

nihaoljq2010的博客 833

制作val_list.txt和train_list.txt

语意分割如果只有数据集(只有图片),没有val_list.txt等文件,可参考如下代码: ##制作label list import os import pandas as pd from sklearn.model_selection import train_test_split DATAPATH='/home/aistudio/work/dataset/' lab_train_lists=os.listdir(DATAPATH+'lab_train') lab_train_lists.sor

大鱼的博客 2628

国债期货的日线趋势跟踪策略实现(基于backtrader框架)

通过backtrader框架,我们可以轻松地实现国债期货的日线趋势跟踪策略,并进行回测和验证。通过这种策略,我们可以尝试捕捉国债期货价格的短期趋势,并根据趋势的方向进行交易决策。backtrader提供了许多内置的指标、订单类型和其他功能,可以帮助你进一步优化和改进你的策略。它提供了丰富的工具和功能,使我们能够快速实现和验证我们的交易想法。方法中,我们根据当前价格和前一天的价格判断趋势的方向,并根据趋势的变化进行买入或卖出操作。然后,我们设置了初始资金和交易手续费,并将我们定义的策略。来跟踪每日的收盘价。

NisyPhilosophy的博客 404

深入解析C/C++可变参数:从va_list原理到现代C++最佳实践

可变参数是C/C++中实现函数参数数量灵活性的核心机制,它允许函数接受不定数量的参数。其底层原理基于函数调用栈的内存布局,通过va_start、va_arg和va_end等宏来访问参数列表。这一机制提供了极大的接口灵活性,但也带来了类型安全和内存访问的风险,尤其在多线程和复杂调用链中容易引发难以调试的Bug。在实际应用中,可变参数常见于日志系统、格式化输出等需要灵活接口的场景。本文通过分析va_list的实现细节和常见陷阱,探讨了如何避免参数错位和资源管理问题,并介绍了C++11可变参数模板如何提供类型安全

weixin_30875157的博客 411

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

VA_ARG IN EFI

VA_ARG IN EFI1. Introduction 可变参数其实是标准C语言一个内建的功能,它和EFI本身并没有太多关系。但是它在EDK中有重新实现和使用,而且我们家的code base使用频繁,很多oem callback都使用了可变参数以此获得函数格式的统一以及参数传递的灵活性。所以我就提一下可变参数的实现,希望对Legacy BIOS转过来的以及对C不是很熟悉的朋友有所帮助

Dig into computer system. 3056

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C 语言的“秘密武器”:可变参数初探(以 printf 为例

您有没有想过,我们平时使用的printf函数为什么这么神奇?奇?// 只需要一个参数\n");// 需要两个参数printf("我的年龄是 %d\n", 25);// 需要三个参数printf("我叫 %s,我今年 %d 岁。\n", "小明", 25);它接收的参数数量竟然可以随时变化!这就是 C 语言的“可变参数”(Variadic Arguments)功能。它允许我们定义一个函数,这个函数可以接受数量不固定的参数。

wudu_123456的博客 242

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

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

C语言的那些小秘密之变参函数的实现

在学习C语言的过程中我们可能很少会去写变参函数,印象中大学老师好像也没有提及过,但我发现变参函数的实现很巧妙,所以还是特地在此分析下变参函数的实现原理。无需标准C的支持,我们自己写代码来实现。先来看看一个实现代码:#include #define va_li

bigloomy的专栏 1万+

C语言函数可变参数的秘密

C语言中类似printf()函数这样支持可变参数的功能是如何实现的?这要归功于va_start,va_arg,va_end等几个宏的支持。   这个几个宏定义如下:   #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) &amp; ~(sizeof(int) - 1) ) // 此句宏的作用是将类型n的大小向上取成4的倍数,如...

Devil_2009的专栏 566

第45课 函数参数的秘密(下)

参数入栈顺序: 调用约定: gcc语言默认使用__cdecl调用约定。调用约定不是语言的一部分,是编译器的一部分。 调用约定使用的最典型的地方就是库函数的调用。因为库的编译方式我们的自己的程序的编译方式可能不一样。 小问题: 如何编写一个计算n个数平均值的函数? 示例程序: 1 #include <stdio.h> 2 ...

diaozhiwa5526的博客 110

C语言变参函数的实现,C语言的那些小秘密之变参函数的实现

在学习C语言的过程中我们可能很少会去写变参函数,印象中大学老师好像也没有提及过,但我发现变参函数的实现很巧妙,所以还是特地在此分析下变参函数的实现原理。无需标准C的支持,我们自己写代码来实现。本文引用地址:http://www.eepw.com.cn/article/270588.htm先来看看一个实现代码:#include#define va_list void*#define va_arg(a...

weixin_42505792的博客 219

C语言函数参数的秘密(下)

Make a little progress every day.

ABCisCOOL的博客 298

C语言进阶第45式:函数参数的秘密(下)

函数参数的秘密

东川 255

深入解析C语言va_list:可变参数函数的底层原理与实战应用

在C/C++编程中,函数调用约定和栈内存管理是理解程序运行机制的基础。函数调用时,参数通过特定规则压入栈中,而可变参数函数则通过va_list机制在运行时动态访问这些参数。这一技术解决了函数接口灵活性的核心问题,使得开发者能够实现如printf、自定义日志库等需要处理不定数量参数的实用功能。其技术价值在于提供了底层系统编程的灵活控制能力,但同时也带来了类型安全和内存对齐等挑战。在实际应用场景中,va_list广泛用于日志记录、字符串格式化、调试工具等模块。本文通过分析va_list的底层实现,结合栈帧模型和

weixin_33146151的博客 291

C/C++可变参数原理与工程实践:从va_arg到variadic template

可变参数是C/C++中支撑printf、日志、API封装等关键功能的基础机制,其本质涉及调用约定、栈布局与ABI契约。C语言通过va_start/va_arg实现运行时参数遍历,但缺乏类型安全,易引发内存越界与崩溃;C++11引入的可变参数模板则将类型检查前移至编译期,依托参数包展开与完美转发保障安全性与性能。该技术广泛应用于嵌入式驱动、网络中间件、高性能日志系统及C API封装场景,尤其在需兼顾兼容性与类型安全的混合编程中,成为规避core dump和调试困境的核心工程能力。

weixin_34265814的博客 288

【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器

C++ 标准模板库(STL)中的 list 容器是双向链表结构,适用于频繁的插入与删除操作,但不支持随机访问。相比 vector,list 的插入和删除效率极高,尤其适合在需要频繁修改链表结构的场景下使用。本文通过详细的代码示例,从 list 的构造、插入、删除、排序、迭代器操作,到内存管理,全面深入地解析 list 容器,帮助读者快速掌握其特性与用法。无论你是 C++ 初学者还是进阶者,都可以通过本文轻松掌握 list 的高效操作。

半截诗的博客~ 2160

python list底层实现原理

list底层实现原理0 前言1 List对象的C结构2 List的初始化3 Append4 Insert5 Pop6 Romve总结 0 前言 在Python中list特别有用。在使用的过程中,python中的list呈现给我们的是一个长度可变对的数组。但是list底层的数据结构是什么呢?这篇文章就来介绍Python中list是如何实现的。 原文是这篇英文原文Python list implementation。 1 List对象的C结构 来看下面简单的程序,在list中添加一些整数并将他们打印出来。 &g

Lavi的专栏 1万+
上一篇: 无向图算法之CC算法
下一篇: 大型源码阅读辅助工具
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值