首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我可以避免用__attribute__字符串围绕_stdcall吗?

attribute字符串是一种用于指定编译器属性的语法,而_stdcall是一种调用约定,用于指定函数参数的传递方式和堆栈清理方式。在某些编译器中,可以使用attribute((stdcall))来指定函数使用_stdcall调用约定。

然而,attribute字符串是与特定编译器相关的语法,不是标准的C或C++语法。因此,如果你想编写可移植的代码,最好避免使用attribute字符串围绕_stdcall。

如果你想在使用_stdcall调用约定的函数上添加属性,可以考虑使用其他可移植的方法。例如,在C++中,你可以使用关键字__stdcall来指定函数的调用约定。在C中,你可以使用宏定义或条件编译来实现类似的效果。

总结起来,为了编写可移植的代码,最好避免使用attribute字符串围绕_stdcall,而是使用其他可移植的方法来指定函数的调用约定。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【redis源码学习】simple dynamic strings(简单动态字符串 sds)

文章目录 接 化 sds 结构分析 基本操作 创建字符串 释放字符串 sdsMakeRoomFor 扩容 小tip:`__attribute__ ((__packed__))` 发 接 阅读源码之前,先接几个问题...,觉得还蛮有意思的。...__ ((__packed__)) sdshdr8 { //该字段记录的字符串的长度,可以在常数时间获取 //由于有长度记录变量len,在读写字符串的时候不依赖于‘\0’,从而保证了二进制安全性...但是一个字符串过大也没用。 使用柔性数组除了省内存,还有一个好处,柔型数组的内存和结构体是连续的,可以很方便的通过柔型数组的首地址偏移得到结构体的首地址。...小tip:__attribute__ ((__packed__)) 在结构体声明当中,加上attribute ((packed))关键字,它可以做到让我们的结构体,按照紧凑排列的方式,占用内存。

31010

redis为什么不直接使用C字符串,而要自定义简单动态字符串

简单动态字符串 redis中的简单动态字符串定义如下: struct __attribute__ ((__packed__)) sdshdr64 { uint64_t len; //已使用...__attribute__ ((packed)) 取消了默认的字节对齐,使得flags前后不会有潜在的填充字段,也便于网络传输(扩展内容参考《理一理字节对齐的那些事》)。...如果有频繁地修改字符串,就会导致系统中频繁的内存申请,释放,拷贝,这样还能有高效的redis? 因此在redis中,如果有这样的情况,分配新的空间的时候,会预分配一些空间,以备下次使用。...所以要想存储一些特殊的字符串,即中间可能出现\0的字符串,传统的C字符串还不好办呢。 sds就不一样了,管你存什么,反正长度是记录在len字段中了,输入写入多少,记录多少。...因此它可以保存二进制数据。 兼容传统字符串的常见用法 虽然redis新定义了sds这样的结构,但是能应用于传统C字符串的函数,同样可以应用于sds。这点在《数组下标-1你见过?》

1.5K10
  • 【Redis 系列】redis 学习十五,redis sds数据结构和底层设计原理

    redis sds数据结构和底层设计原理 redis 是 C 语言写的,那么我们思考一下 redis 是如何表示一个字符串的?redis 的数据结构和 C 语言的数据结构是一样的?...42 亿,其实远远没有必要使用 int32 ,太浪费资源了 下面的数据结构,可以根据不同的需求,选取不同的数据结构进行使用 struct __attribute__ ((__packed__)) hisdshdr5...欢迎点赞,关注,收藏 朋友们,你的支持和鼓励,是坚持分享,提高质量的动力 欢迎大家对文章中的源码细节进行讨论和分享,不足之处还请多多指教,如果大佬们有更好的学习方法还请给予指导,谢谢 1、评论区超过...10 人互动(不含作者本人),作者可以以自己的名义抽奖送出掘金徽章 2 枚(掘金官方承担) 好了,本次就到这里 技术是开放的,我们的心态,更应是开放的。...是小魔童哪吒,欢迎点赞关注收藏,下次见~

    32030

    Redis的String类型,原来这么占内存

    本文使用的 Redis Server 及下文源码都是 6.2.4 版本。 redis-cli -h 127.0.0.1 -p 6379 然后执行下面的命令查看 Redis 的初始内存使用情况。...图片 ID 和图片存储对象 ID 都是 10 位数,而 8 字节的 Long 类型最大可以表示 2 的 64 次方的数值,肯定可以表示 10 位数。...2、String 类型的底层实现 当你保存的数据中包含字符时,String 类型就会用简单动态字符串(Simple Dynamic String,SDS)结构体来保存。...当保存的是字符串数据,并且字符串小于等于 44 字节时,RedisObject 中的元数据、指针和 SDS 是一块连续的内存区域,这样就可以避免内存碎片。...最后 既然 String 类型这么占内存,那么你有好的方案来节省内存

    96160

    Redis的String类型,原来这么占内存

    本文使用的 Redis Server 及下文源码都是 6.2.4 版本。 redis-cli -h 127.0.0.1 -p 6379 然后执行下面的命令查看 Redis 的初始内存使用情况。...图片 ID 和图片存储对象 ID 都是 10 位数,而 8 字节的 Long 类型最大可以表示 2 的 64 次方的数值,肯定可以表示 10 位数。...2、String 类型的底层实现 当你保存的数据中包含字符时,String 类型就会用简单动态字符串(Simple Dynamic String,SDS)结构体来保存。...当保存的是字符串数据,并且字符串小于等于 44 字节时,RedisObject 中的元数据、指针和 SDS 是一块连续的内存区域,这样就可以避免内存碎片。...最后 既然 String 类型这么占内存,那么你有好的方案来节省内存

    1.2K60

    String底层实现——动态字符串SDS

    SDS的优势 我们可以看到是对字符数组的再封装,但是为什么呢,直接使用字符数组不是更简单?这要从C和Java语言的根本区别说起。...更快速的获取字符串长度 我们都知道Java的字符串有提供length方法,列表有提供size方法,我们可以直接获取大小。但是C却不一样,更偏向底层实现,所以没有直接的方法使用。...数据安全,不会截断 如果传统字符串保存图片,视频等二进制文件,中间可能出现'\0',如果按照原来的逻辑,会造成数据丢失。所以可以用已用长度来表示是否字符数组已结束。 ...但是大家有没有疑问,这不是一行代码搞定的事,为啥要抽象出方法呢?...如果觉得写得还行,麻烦给个赞,您的认可才是写作的动力! 如果觉得有说的不对的地方,欢迎评论指出。 好了,拜拜咯。

    58730

    一个小技巧在SMT32程序HEX文件中加入固件版本信息

    本文内容转自阿莫论坛,作者icode 分享一个小技巧,使用MDK编译器,让STM32程序HEX文件中加入固件版本信息,估计很多老手都已经在使用(你有好的方法欢迎分享,希望的砖能引来你的玉),该方法献给新手或初学者...__((at(VERINFO_ADDR_BASE + 0x00))) = "Hardware: 1.0.0"; const char Firmware_Ver[] __attribute__((at(...xiaomu: 这样可以, 但是有一个缺点,就是生成的bin文件都是满flash大小的, 造成每次烧录都是整个flash读写。...其实这个可以把存放地址放到前面,比如偏移1K的地方,都不用改指定地址 icode: 是的, 程序末尾 到 VERINFO_ADDR_BASE地址这一段会被填充成0x00, 根据需要可以修改 VERINFO_ADDR_BASE...减小地址 或者说 不强制指定地址, 由编译器自动分配, 但这样就要去找相应的版本标识字符串了。

    71310

    透过Redis源码探究字符串的实现

    header 的结构体使用 __attribute__ 修饰,这里主要是防止编译器自动进行内存对齐,这样可以减少编译器因为内存对齐而引起的 padding 的数量所占用的内存。...; sdsempty 会创建一个空字符串 “”; sdsdup 调用 sdsnewlen,复制一个已存在的字符串; 所以通过上面的创建可以知道,最终都会调用 sdsnewlen 来创建字符串...关于内存对齐相关的知识,在 《Go中由WaitGroup引发对内存对齐思考》 这篇文章里面也讲解过了,知识点是通用的,感兴趣的可以回过去看看。...return s; } 上面的过程已经标注清楚了,可能直接看代码比较难理解这里的头结构体构造的过程,下面用一张图表示一下指针指向的位置: 字符串拷贝 sds sdsnewlen(const void...字符串是否可以在原来的位置追加空间,还是需要重新申请一块内存区域。 那么下面把 sdsMakeRoomFor 函数分为两部分来看:扩容、内存申请。

    19710

    MySQL见闻录 - 入门之旅(六)(C++操作MySQL)

    1、的上课笔记 MySQL数据库从入门到实战应用(学习笔记一) MySQL数据库从入门到实战应用(学习笔记二) MySQL数据库从入门到实战应用(学习笔记三) C++语言使用MySQL 也是个新手,...执行SQL语句*/ int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length); /*如果SQL语句是C风格字符串...两个函数的原型分别为: MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql); MYSQL_RES * STDCALL mysql_use_result...该函数返回MYSQL_ROW型的变量,即字符串数组,假设为row,则row[i]为第i个字段的值。当到结果集尾部时,此函数返回NULL。...void STDCALL mysql_close(MYSQL *sock); 6、看个实例融会贯通一下 就是个实例,也不是写的,也是刚入门。

    1.8K50

    Win32汇编:字符串浮点数运算过程

    整理复习汇编语言的知识点,以前在学习《Intel汇编语言程序设计 - 第五版》时没有很认真的整理笔记,主要因为当时是以学习理解为目的没有整理的很详细,这次是第三次阅读此书,每一次阅读都会有新的收获,这次复习...,想把书中的重点,再一次做一个归纳与总结(注:16位汇编部分跳过),并且继续尝试写一些有趣的案例,这些案例中所涉及的指令都是逆向中的重点,一些不重要的就直接省略了,一来提高自己,二来分享知识,转载请加出处...: 过程StrLength()通过循环方式判断字符串结尾的0标志,来统计字符串的长度,最后将结果存储在EAX中. .386p .model flat,stdcall option casemap:...: 字符串转换是将小写转为大写,或者将大写转为小写,其原理是将二进制位第五位置1或0则可实现. .386p .model flat,stdcall option casemap:none include...,首先循环将字符串压入堆栈,然后再从堆栈中反向弹出来,这样就可以实现字符串的反转操作了,实现代码如下: .386p .model flat,stdcall option casemap:none

    48020

    Redis字符串SDS底层结构详解!

    因此,上层可以像读取 C 字符串一样读取 SDS 的内容,兼容 C 语言处理字符串的各种函数,同时也能通过 buf 地址的偏移,方便地获取其他变量; 读写字符串不依赖于 \0,保证二进制安全。...底层编码选择 字符串是 Redis最基本的数据类型,Redis 中字符串对象的编码可以是下面三种类型: int 编码:存储8个字节的长整型(long,2^63-1)字符串,长度小于等于20 embstr...编码:长度小于44字节的字符串 raw 编码:长度大于44字节的字符串 讲了半天理论还比不上一个案例,这里举个栗子: 以下案例截取自网络 从图中我们可以可以发现,当输入纯数字字符串的时候,采用的是 int...觉得可能还有如下考虑 程序中一般不会有那么大的数据量存入缓存 大的数据量对网络和性能有一定影响 2:SDS如何空间预分配和惰性空间释放?...欢迎点赞 、收藏 、关注 三连支持一下~ 知道的越多,不知道的也越多,是小许,下期见~

    32710

    Redis 源码简洁剖析 02 - SDS 字符串

    C 语言的字符串函数 C 语言 string 函数,在 C 语言中可以使用 char* 字符数组实现字符串,C 语言标准库 string.h 中也定义了多种字符串操作函数。...字符串使用广泛,需要满足: 高效的字符串操作,比如追加、拷贝、比较、获取长度 能保存任意的二进制数据,比如图片 尽可能省内存 为什么 Redis 不直接使用 C 语言的字符串?...C 语言 char* 获取字符串长度的时间复杂度是 O(N);追加字符串的时间复杂度也是 O(N),同时可能由于可用空间不足,无法追加。 下面代码展示了 C 语言中 '\0' 结束字符对字符串的影响。...其中可以发现 Redis 给 char* 起了别名: typedef char *sds; SDS 内部结构 SDS 结构中有一个元数据 flags,表示的是 SDS 类型(最低 3 位)。...~ 原创不易,希望大家转载时请先联系,并标注原文链接。

    35230

    RT-Thread FinSH控制台添加自定义msh命令原理「建议收藏」

    大家好,又见面了,是你们的朋友全栈君。 FinSH 是 RT-Thread 的命令行组件,提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息。...它可以使用串口 / 以太网 / USB 等与 PC 机进行通信。 FinSH 提供了多个宏接口来导出自定义命令,导出的命令可以直接在 FinSH 中执行。...自定义的 msh 命令,可以在 msh 模式下被运行,将一个命令导出到 msh 模式可以使用如下宏接口: MSH_CMD_EXPORT(name, desc); 示例如下: void hellort...然后定义了一个const struct finsh_syscall类型的结构体并且初始化了,这个结构体原型看下面的代码: 三个成员分别指向函数名字符串,描述字符串,和函数的首地址。 4....__attribute__((used)) unused:表示该函数或变量可能不使用,这个属性可以避免编译器产生警告信息。

    1K10

    对抗静态分析——so文件的加密

    忙了一阵子之后,终于~到了选offer的阶段(你家公司不是牛,老子不接你家offer,哈哈哈哈~),可以喘(出)口(口)气(恶)了(气)。。。...ELF文件中的每个section都是有名字的,比如.data、.text、.rodata,每个名字都是一个字符串,既然是字符串就需要一个字符串池来保存,而这个字符串池也是一个section,或者说准备一个...section用来维护一个字符串池,这个字符串池保存了其他section以及它自己的名字。...(希望解释清楚了~) segment头部结构 typedef struct elf32_phdr{ Elf32_Word p_type; /* WARNING: DO NOT EDIT, AUTO-GENERATED...() __attribute__((constructor)); 这两个函数之后都有__attribute__,这是GCC的编译选项,用于设定函数属性。

    1.8K90
    领券