C/Lua/C++
文章平均质量分 62
「已注销」
程序员
展开
-
C 中 i=i+i++之类问题。
i=i+i++之类问题,根本不是优先级的问题。简单说吧,a = b ,意思是,先计算出表达式b的值,然后把这个值赋给a。表达式的定义为: 一个单独的字面值,或者一个单独的变量,或者通过算术/逻辑运算甚至函数调用连接起来的表达式。显然,对于表达式b来说,它的运算符优先级有多复杂都不是问题。但,请注意,表达式里面不允许出现赋值操作,因为这个操作并不是算术/逻辑运算。原创 2015-02-02 09:47:21 · 696 阅读 · 0 评论 -
C 中的main函数的参数详解
我们经常看到main函数不带参数。因此main后都是空括号。C代码 main() { ... } 实际上,main函数必须带参数,这个参数可以认为是main函数的形式参数。C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。因此,main函数的函数头可写为:C代码转载 2014-12-29 10:12:29 · 758 阅读 · 0 评论 -
开源项目
代码阅读——十个C开源项目1. Webbench2. CMockery3. Libev4. Memcached5. Lua6. SQLite7. Redis8. Nginx9. UNIXv610. NETBSD代码阅读——十个C开源项目1. WebbenchWebbench是一个在linux下使用的非常简单的网原创 2014-12-30 14:58:25 · 474 阅读 · 0 评论 -
c语言的灵魂——指针
大家都认为,c语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是c语言的灵魂,一点都不为过。那么加强对指针的认识和理解,是提高C语言水平很关键的一部分。下面是一些指针总结,希望能够抛砖引玉大家相互交流相互学习。1. 指针是什么? 指针,是一个无符号整数(unsigned int),它是一个以当前系统寻址范围为取值范围的整数。32位系统下寻址能力(地址空间)是4G转载 2014-12-31 13:06:22 · 1013 阅读 · 0 评论 -
C语言核心技术
================================================C语言编译分析记号,有一个原则是尽可能靠左合并符号使其得到符合语法的记号,所以a+++b 会被解释为 (a++)+b 而不是 a+(++b)================================================函数作用域和语句块作用域:一直以为函转载 2015-01-22 10:41:16 · 656 阅读 · 0 评论 -
为什么很多大牛在写题的时候要加一堆宏?
给你说几个 inline 无法代替宏的地方:1. 循环展开:// loop unroll double#define LOOP_UNROLL_DOUBLE(action, actionx2, width) do { \ unsigned long __width = (unsigned long)(width); \ unsigned long __increment转载 2015-06-05 09:05:46 · 869 阅读 · 0 评论 -
offsetof与container_of宏(个人理解)
1、前言 今天在看代码时,遇到offsetof和container_of两个宏,觉得很有意思,功能很强大。offsetof是用来判断结构体中成员的偏移位置,container_of宏用来根据成员的地址来获取结构体的地址。两个宏设计的很巧妙,值得学习。linux内核中有着两个宏的定义,并在链表结构中得到应用。不得不提一下linux内核中的链表,设计的如此之妙,只需要两个指针就搞定了。后续认转载 2015-07-27 17:36:13 · 459 阅读 · 0 评论 -
内存分配理解
字符串常量,放在哪个存储区呢?是“自动存储区”还是“静态存储区”中?比如:char *pstr="hello world!";这里,"hello world!"是一个字符串常量,pstr是在栈中的变量。我想问,字符串常量,在哪个内存区域分配空间呢?好像应该不是在“栈区“分配空间吧!!!一、预备知识—程序的内存分配一个由C/C++编译的转载 2015-02-27 17:06:20 · 423 阅读 · 0 评论 -
指针和引用的区别总结
指针和引用的区别总结1.从现象上看:指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变2.从内存分配上看:程序为指针变量分配内存区域,而引用不分配内存区域3.从编译上看:程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不原创 2015-01-13 14:15:02 · 421 阅读 · 0 评论 -
<Dota传奇>/<开心消消看>/<天龙八部3> Lua 反编译
如果你只是想拿到lua源码,这里告诉你一个捷径:hook luaL_laodbuffer。得到*.abc的原文后,其实是luac编译后的bin文件。这个时候你用luadec神马的反编译是无法得到源代码的,其结果也是直接报错。这就是DOTA传奇在Lua层做的保护。破掉保护也比较容易,入手点就从luaL_loadbuffer开始,发现是bin文件就直接走undump,内部是Lo原创 2015-04-01 09:19:57 · 3033 阅读 · 0 评论 -
Lua lib 加载分析
String Lib 加载部分-----------------------------以 string lib 为例,加载代码如下:LUAMOD_API int luaopen_string (lua_State *L) { luaL_newlib(L, strlib); createmetatable(L); return 1;}函数主要有 2 行,luaL_n原创 2015-06-17 15:09:33 · 844 阅读 · 0 评论 -
该怎样理解 Lua 逻辑运算符 and 和 or 的设计?
我想这个应该是和“短路求值”相关。因为:a and b: 如果a为false,那么b的结果是false还是true已经不重要,因为整个表达式的结果已经是false了,所以直接返回a就可以了同理,a or b:如果a为true,那么b的结果是false还是true已经不重要,因为整个表达式的结果已经是true了,所以直接返回a就可以了这是一种优化,避免不必原创 2015-06-16 14:53:47 · 548 阅读 · 0 评论 -
Lua脚本反编译入门
1.Lua的虚拟机指令,5.2 的有40条Lua的指令使用一个32bit的unsigned integer表示。所有指令的定义都在lopcodes.h文件中(可以从Lua 官方网站下载),使用一个enum OpCode代表指令类型。在lua5.2中,总共有40种指令(id从0到39)。根据指令参数的不同,可以将所有指令分为4类:typedef enum {/*-----原创 2015-03-31 22:59:08 · 11205 阅读 · 0 评论 -
Lua反编译流程
0. 总纲lua源文件--obfuscate-->lua源文件(混淆后)--compile-->luac文件(带调试用的变量名和行号)--strip-->luac文件(不带调试信息)lua/luac--加密/打包-->数据文件数据文件--解包/解密-->lua/luac-->lua虚拟机1. 跟踪,脱壳,解包,解密,获得 luac追 luaL_loadbuf转载 2015-03-31 21:28:51 · 17351 阅读 · 1 评论 -
Lua 使用过程的一个理解(lua_pcall(L, 0, 0, 0);)
首先看一段小小小程序//test.luafunction printmsg() print("hello world") end x = 10 //test.c#include #include #include #include #include原创 2015-03-03 09:52:02 · 6375 阅读 · 0 评论 -
Lua 的协程 为什么会出现?
一开始大家想要同一时间执行那么三五个程序,大家能一块跑一跑。特别是UI什么的,别一上计算量比较大的玩意就跟死机一样。于是就有了并发,从程序员的角度可以看成是多个独立的逻辑流。内部可以是多cpu并行,也可以是单cpu时间分片,能快速的切换逻辑流,看起来像是大家一块跑的就行。但是一块跑就有问题了。我计算到一半,刚把多次方程解到最后一步,你突然插进来,我的中间状态咋办,我用来储存的内存被你覆盖了咋办原创 2015-02-03 13:49:59 · 1046 阅读 · 0 评论 -
突然想到Lua中的协程其实是这样的
Lua的coroutine 让原来要使用异步+回调方式写的非人类代码,可以用看似同步的方式写出来...原创 2015-02-03 13:45:16 · 594 阅读 · 0 评论 -
lua5.2 带你理解_ENV和_G
5.1之前, 全局变量存储在_G这个table中, 这样的操作:a = 1 相当于:_G['a'] = 1但在5.2之后, 引入了_ENV叫做环境,与_G全局变量表产生了一些混淆,需要从原理上做一个理解。在5.2中, 操作a = 1相当于_ENV['a'] = 1这是一个最基础的认知改变,其次要格外注意_ENV不是全局变量,而是一个upvalue(非局部变量原创 2014-12-25 13:39:21 · 1777 阅读 · 0 评论 -
Lua关键字
Lua关键字 22个1. 逻辑 关键字 and , or, not2. 基本类型 function, table,nil, 3. for , while , do , break, in ,return , until , goto ,repeat4. true ,false5.if , then , else , elseif6. local原创 2014-12-19 13:01:36 · 5135 阅读 · 0 评论 -
Lua学习笔记:面向对象
Lua 中只存在表(Table)这么唯一一种数据结构,但依旧可以玩出面向对象的概念。添加成员函数好吧,如果熟悉 C++ 还是很好理解类似的进化过程的:如果说 struct 里可以添加函数是从C 过渡到 C++ 的第一认识的话,为 Table 添加函数也可以算是认识 Lua 是如何面向对象的第一步吧。player = { health = 200 } --> 一个普通的 playe原创 2014-12-14 01:28:56 · 564 阅读 · 0 评论 -
Lua源代码阅读(五)数据栈与调用栈组成的 线程(协程)
1: 若 lua 仅作为一种独立语言,支持协程可能并不算麻烦。可困难在于 lua 生来以一门嵌入式语言存 在,天生需要大量与宿主系统 C 语言做交互。 2: 典型的应用环境是由 C 语言开发的系统,嵌入 lua 解析器, 加载 lua 脚本运行。同时注入一些 C 函数供 lua 脚本调用。lua 作为控制脚本,并不直接控制外界的模块, 做此桥梁的正是那些注入的原创 2015-01-20 15:49:42 · 1434 阅读 · 0 评论 -
Lua源代码阅读(三)table的算法
/* 1:Table按照Lua语言的定义,需要实现四种基本操作:读、写、迭代和获取长度。 2:Lua中并没有删除操作,而仅仅是把对应键位的值设置为nil。 3:写操作被实现为查询已有键位,若不存在则创建新键。 得到键位后,写入操作就是一次赋值。 4:所以,在table模块中,实际实现的基本操作为:创建、查询、迭代和获取长度*原创 2015-01-20 10:01:03 · 802 阅读 · 0 评论 -
Lua源代码阅读(二)string的实现
原创 2015-01-19 20:24:19 · 680 阅读 · 0 评论 -
Lua源代码阅读(一)
lualib.h 打开Lua api库函数 Lua5.3中❤️增utf8库#define LUA_UTF8LIBNAME "utf8"LUAMOD_API int (luaopen_utf8) (lua_State *L);jks原创 2015-01-19 14:31:10 · 2103 阅读 · 0 评论 -
bit32位运算库
位运算库lua中的位运算由于数值类型是浮点型,所以支持效果不太好。lua中利用一些位运算实现一些算法。如:左移相当于乘以2,右移相当于除以2.而对于按位与和按位或这两个概念则需要额外讨论了,这也是由于浮点型数值所带来的影响。lua5.2中通过位库提供了位运算来修正这些影响,而不是lua中的预定义操作。这种接口设计表明lua中实现位运算不是原创 2015-01-14 17:14:54 · 5622 阅读 · 0 评论 -
LUA string库详解
1. string库中所有的字符索引从前往后是1,2,...;从后往前是-1,-2,...2. string库中所有的function都不会直接操作字符串,而是返回一个结果 string.byte(string [,pos]):返回第pos个字符的整数表示形式.如a为97.string.char(i1,i2...):i1,i2为整型,将i1,i2..等转化为对应的字符然后连接成字符原创 2015-01-14 17:13:42 · 911 阅读 · 0 评论 -
Lua源代码阅读(四)tm元方法优化
1: Lua实现复杂数据结构,大量依赖给 table 附加一个元表(metatable)来实现。故而table 本身的一大作用就是作为元表存在。 2: 查询元表中是否存在一个特定的元方法就很容易成为运行期效率的热点。如果不能高效的解决这个热点,每次对带有元表的table的操作,都需 要至少多作一次hash查询。3: 但是,并非所有元表都提供了所有元方法的,对于原创 2015-01-20 11:11:34 · 703 阅读 · 0 评论 -
Lua源代码的阅读(三)table的实现
数据结构/* 1: table的数组部分被储存在TValue *array中,其长度信息存于int sizearray; 2: 哈希表储存在Node *node,哈希表的大小用 lu_byte lsizenode 表示; 3:由于哈希表的大小一定为2的整数次幂,所以这里的lsizenode表示的是幂次,而不是实际大小 4:每个table结构,原创 2015-01-19 20:50:09 · 635 阅读 · 0 评论 -
Lua5.3 released 变化
待总结Main changesintegers (64-bit by default)official support for 32-bit numbersbitwise operatorsbasic utf-8 supportfunctions for packing and unpacking valuesHere are the other changes int原创 2015-01-13 10:34:30 · 1153 阅读 · 0 评论 -
学习Lua
决定开始使用 Linux + C +lua的组合 Lua的优点:快,小,轻(少) 小:~200k二进制库 ~20k C代码行少:简单 关键字 C++ 82 , python 33, C 32 , Go 25, Lua 22 APi: C 79个 VM指令 30个内建coroutine 协程原创 2014-12-19 09:53:33 · 501 阅读 · 0 评论 -
Lua5.2改动
第三方cmodule,如使用luaL_register需要改为 luaL_newlib。如lfs库luaL_register (L, "lfs", fslib) 改为luaL_newlib(L,fslib);。这里本来第二个参数是表明,非nil是把所有接口放到一个全局变量table中,nil就是所有接口都是全局函数。现在是强制取消全局接口了。所有第三方库没有gloable的函数了,所以使用时都原创 2014-12-23 14:35:54 · 679 阅读 · 0 评论 -
Lua 阅读源代码的次序
Lua 的源代码有着良好的设计,优美易读。其整体篇幅不大,仅两万行 代码左右。但一开始入手阅 读还是有些许难度的。从易到难,理清作者编写代码的脉络非常重要。LuaJIT 的作者 在回答“哪一个开源代码项目 设计优美,值得阅读不容错过”这个问题时,推荐了一个阅读次序:首先、阅读外围的库是如何实现功能扩展的,这样可以熟悉 LUA公开 API 。不必陷入功能细节。然后、阅读 API 的具体实原创 2014-12-26 11:13:52 · 1504 阅读 · 0 评论 -
C语言中闭包的探究及比较
这是一篇技术分享,并且之前发表在酷壳上,http://coolshell.cn/articles/8309.html,现在发布到自己的博客上。下文是直接从酷客复制过来的,这里偷了个懒,没有再次对格式做很仔细的整理,只有稍微整理。汗。这里主要讨论的是C语言的扩展特性block。该特性是Apple为C、C++、Objective-C增加的扩展,让这些语言可以用类Lamb转载 2014-12-25 13:22:45 · 536 阅读 · 0 评论 -
gcc编译器 CFLAGS 标志参数说明
CFLAGS = -g -O2 -Wall -Werror -Wno-unused编译出现警告性错误unused-but-set-variable,变量定义但没有使用,解决方法:增加CFLAGS 或CPPFLAGS参数如下:CPPFLAGS=" -Werror -Wno-unused-but-set-variable" || exit 1Gcc总体选项列表转载 2015-03-04 10:19:56 · 2250 阅读 · 0 评论 -
Lua和C交互——C API
C和Lua交互的部分称为C API。C API是一个C代码与Lua进行交互的函数集。他由以下部分组成:读写Lua全局变量的函数、调用Lua函数的函数、运行Lua代码片断的函数、注册C函数然后可以在Lua中被调用的函数,等等。 API中有些函数为了方便以宏的方式实现。 当在Lua和C之间交换数据时我们面临着两个问题:动态与静态类型系统的不匹配和自动与手动内存管理的不一致。解决办法原创 2014-12-22 15:07:14 · 619 阅读 · 0 评论 -
Lua内存管理
Lua 要求用户给出一个内存管理函数,在Lua创建虚拟机的时候传入。。 它利用C 标准库中的函数实现了一个默认的内存管理器,这也可以帮助我们理解这个内存管理器的语义。 1: Lua定义的内存管理器仅有一个函数,虽然接口上类似原创 2015-01-19 17:00:39 · 2543 阅读 · 0 评论 -
Lua 5.3 源码分析(一)类型系统
Lua 5.3 源码分析(一)类型系统数据类型/*** basic types*/#define LUA_TNONE (-1)#define LUA_TNIL 0#define LUA_TBOOLEAN 1#define LUA_TLIGHTUSERDATA 2#define LUA_TNUMBER 3#define LUA_TSTRI原创 2017-08-18 10:31:17 · 2902 阅读 · 1 评论 -
Lua 5.3 源码分析(四)线程 lua_State
Lua 5.3 源码分析(四)线程 lua_StateLua 的THREAD 类型定义如下图: /* ** ‘per thread’ state */ struct lua_State { //1 Lua 类型公共头部 CommonHeader; //2 global_State *l_G原创 2017-08-18 11:16:51 · 2382 阅读 · 0 评论 -
Lua 5.3 源码分析(十)线程的执行与中断
Lua 5.3 源码分析(十)线程的执行与中断Lua 的程序运行时以线程为单位的。每个Lua 线程可以独立运行直到自行中断,把中断的信息留在状态机中。每条线程的执行互不干扰,可以独立延续之前中断的执行过程。Lua 线程和系统线程无关,所以不会为每条 Lua 线程创建独立的系统堆栈,而是利用自己维护的线程栈,内存开销也就远小于系统线程。Lua 是一门嵌入式语言,和 C 语言混合编程是一种常态。 一旦L原创 2017-08-18 09:56:57 · 2572 阅读 · 0 评论 -
Lua 5.3 源码分析(六) 字符串 Table
Lua 5.3 源码分析 (六) 表 Tabletypedef union TKey { struct { TValuefields; int next; /* for chaining (offset for next node) */ } nk; TValue tvk;} TKey;/* copy a value into a key without messi原创 2017-08-18 11:31:26 · 650 阅读 · 0 评论