菜菜CPP日记
分支预测建议:
http://www.cppblog.com/mysileng/archive/2014/09/29/208454.html
#ifndef likely
#define likely(x) __builtin_expect(!!(x), 1)
#endif
#ifndef unlikely
#define unlikely(x) __builtin_expect(!!(x), 0)
#endif
内存对齐:
这个表达式的意思就是 d/a 向上取整(a是2的倍数)。也就是说 如果表达式的结果是n那么
(n - 1) *a<d <= n * a,
如果按a对齐那么至少要申请n这么大才能把d放里面。
#define align_ptr(p, a) (uint8_t*)(((uintptr_t)(p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))
#define align(d, a) (((d) + (a - 1)) & ~(a - 1))
属性暗示:
http://www.cnblogs.com/sunyubo/archive/2010/12/20/2282084.html
#define ignore(exp) {int ignore __attribute__ ((unused)) = (exp);}
// 内存对齐
struct my_unpacked_struct
{
char c;
int i;
};
struct my_packed_struct
{
char c;
int i;
struct my_unpacked_struct s;
}__attribute__ ((__packed__));
汇编与锁:
http://blog.csdn.net/lu_ming/article/details/4984115
http://blog.csdn.net/maotianwang/article/details/9154159
/ 32位系统
static __inline__ void atomic32_add(volatile int32_t *v, int i) {
__asm__ __volatile__("lock;" "addl %1,%0"
: "=m" ((*v)) : "r" (i), "m" ((*v)));
}
static __inline__ int32_t atomic32_add_return(volatile int32_t *value, int32_t diff)
{
int32_t old = diff;
__asm__ volatile (
"lock;" "xaddl %0, %1"
:"+r" (diff), "+m" (*value) : : "memory");
return diff + old;
}
static __inline__ void atomic32_inc(volatile int32_t *value *v)
{
__asm__ __volatile__("lock;" "incl %0" : "=m" (*v) :"m" (*v));
}
static __inline__ void atomic32_dec(volatile int32_t *value*v)
{
__asm__ __volatile__("lock;" "decl %0" : "=m" (*v) :"m" (*v));
}
static __inline__ int32_t atomic_cmp_set(volatile int32_t *lock, int32_t old, int32_t set)
{
uint8_t res;
__asm__ volatile (
"lock;" "cmpxchgl %3, %1; sete %0"
: "=a" (res) : "m" (*lock), "a" (old), "r" (set) : "cc", "memory");
return res;
}
//
#define trylock(lock) (*(lock) == 0 && atomic_cmp_set(lock, 0, 1))
#define unlock(lock) {__asm__ ("" ::: "memory"); *(lock) = 0;}
// 自旋lock
static __inline__ void spin_lock(volatile int32_t *lock)
{
int i,n;
for(;;) {
if(*lock == 0 && atomic_cmp_set(lock, 0, 1)) {
return;
} for(n = 1; n < 1024; n <<= 1) {
for(i = 0; i < n; i++) {
__asm__ (".byte 0xf3, 0x90");
} if(*lock == 0 && atomic_cmp_set(lock, 0, 1)) {
return;
}
}
}
//?? sched_yield();
}
#define spin_unlock unlock
菜菜CPP日记的更多相关文章
- Cmake新手使用日记(1)【C++11下的初体验】
第一次使用Cmake,搜索了很多使用教程,包括<Cmake实践>.<Cmake手册>等,但是在针对最新的C++11条件下编程还是会存在一点点问题,需要实验很多次错误并搜索大量文 ...
- ArcGIS 10.5 tensorflow安装日记
ArcGIS 10.5 tensorflow安装日记 商务科技合作:向日葵,135-4855__4328,xiexiaokui#qq.com Datetime: 2019年5月27日星期一 Os: w ...
- VS Code 调教日记(2022.6.26更新)
VS Code 调教日记(2022.6.26更新) 基于msys2的MinGW-w64 GCC的环境配置 下载并安装msys2 到路径...msys2安装路径...\msys64\etc\pacman ...
- 微信小程序开发日记——高仿知乎日报(下)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...
- 微信小程序开发日记——高仿知乎日报(中)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...
- 微信小程序开发日记——高仿知乎日报(上)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...
- Linux学习日记-使用EF6 Code First(四)
一.在linux上使用EF 开发环境 VS2013+mono 3.10.0 +EF 6.1.0 先检测一下EF是不是6的 如果不是 请参阅 Linux学习日记-EF6的安装升级(三) 由于我的数据库 ...
- 使用“Cocos引擎”创建的cpp工程如何在VS中调试Cocos2d-x源码
前段时间Cocos2d-x更新了一个Cocos引擎,这是一个集合源码,IDE,Studio这一家老小的整合包,我们可以使用这个Cocos引擎来创建我们的项目. 在Cocos2d-x被整合到Cocos引 ...
- Json CPP 中文支持与入门示例
在每一个Json Cpp自带*.cpp文件头加上: #include "stdafx.h" 将Json Cpp对自带的头文件的引用修改为单引号方式,例如json_reader.cp ...
随机推荐
- node.js的request模块
request模块让http请求变的更加简单.最简单的一个示例: 1: var request = require('request'); 2: 3: request('http://www.goo ...
- BZOJ 2049 & LCT又一模板
题意: 自己看...加边删边问联通... SOL: 就加了一个findroot而已... 然而时间还是惨不忍睹...优化全开也才1700ms...膜seter... Code: /*========= ...
- 【HDU】1814 Peaceful Commission
http://acm.hdu.edu.cn/showproblem.php?pid=1814 题意:n个2人组,编号分别为2n和2n+1,每个组选一个人出来,且给出m条关系(x,y)使得选了x就不能选 ...
- Android -- 简单的图片浏览器
1. 效果图
- jquery.autocomplete在火狐下的BUG解决
该插件在火狐下使用拼音输入法输入,回车后无法即使响应事件,需要再输入别的字母才会响应事件 主要原因: 该插件响应主要监听了keydown事件 其他浏览器在打开中文输入法的情况下输入的拼 ...
- XCode编译文件过多导致内存吃紧解决方法
XCode编译文件过多导致内存吃紧解决方法 /Users/~~/Library/Developer/Xcode/DerivedData 1) 然后 找到编译文件 删除 就好了哦 快去试试看吧
- 项目管理gitflow的用法(转)
在这里主要讲一下我在项目中用到的关于gitflow的用法. 公司的项目中,专门有一台用来存放版本库的服务器,路径是在默认的安装目录/opt/git/,那么在使用的时候,如果你是一个功能模块或者是一 ...
- Redhat5.8 环境下编译安装 Redis 并将其注册为系统服务
系统环境: $ cat /etc/issueRed Hat Enterprise Linux Server release 5.8 (Tikanga)Kernel \r on an \m 1. 下载安 ...
- DataContract
DataContractAttribute Class is in the System.Runtime.Serialization namespace. But you should add ref ...
- CSS去除firefox点击链接时的虚线边框
a { outline: none; } 或者缩小范围: a:focus { outline: none; }