分支预测建议:

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日记的更多相关文章

  1. Cmake新手使用日记(1)【C++11下的初体验】

    第一次使用Cmake,搜索了很多使用教程,包括<Cmake实践>.<Cmake手册>等,但是在针对最新的C++11条件下编程还是会存在一点点问题,需要实验很多次错误并搜索大量文 ...

  2. ArcGIS 10.5 tensorflow安装日记

    ArcGIS 10.5 tensorflow安装日记 商务科技合作:向日葵,135-4855__4328,xiexiaokui#qq.com Datetime: 2019年5月27日星期一 Os: w ...

  3. VS Code 调教日记(2022.6.26更新)

    VS Code 调教日记(2022.6.26更新) 基于msys2的MinGW-w64 GCC的环境配置 下载并安装msys2 到路径...msys2安装路径...\msys64\etc\pacman ...

  4. 微信小程序开发日记——高仿知乎日报(下)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...

  5. 微信小程序开发日记——高仿知乎日报(中)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...

  6. 微信小程序开发日记——高仿知乎日报(上)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...

  7. Linux学习日记-使用EF6 Code First(四)

    一.在linux上使用EF 开发环境 VS2013+mono 3.10.0 +EF 6.1.0 先检测一下EF是不是6的 如果不是  请参阅 Linux学习日记-EF6的安装升级(三) 由于我的数据库 ...

  8. 使用“Cocos引擎”创建的cpp工程如何在VS中调试Cocos2d-x源码

    前段时间Cocos2d-x更新了一个Cocos引擎,这是一个集合源码,IDE,Studio这一家老小的整合包,我们可以使用这个Cocos引擎来创建我们的项目. 在Cocos2d-x被整合到Cocos引 ...

  9. Json CPP 中文支持与入门示例

    在每一个Json Cpp自带*.cpp文件头加上: #include "stdafx.h" 将Json Cpp对自带的头文件的引用修改为单引号方式,例如json_reader.cp ...

随机推荐

  1. HDU 1754区间最值 & SPLAY

    真是亲切的1754啊..第一道傻逼版的线段树做的是这个,后来学了zkw做的是这个,在后来决定打lrj线段树又打了一遍,如今再用splay和老朋友见面   从上到下依次为:加了读入优化的splay,sp ...

  2. Codeforces Round #245 (Div. 2) A - Points and Segments (easy)

    水到家了 #include <iostream> #include <vector> #include <algorithm> using namespace st ...

  3. Leetcode Linked List Cycle II

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  4. Codeforces Round #242 (Div. 2) C. Magic Formulas

    解题思路是: Q=q1^q2.......^qn = p1^p2......^pn^((1%1)^....(1%n))^((2%1)^......(2%n))^.... 故Q的求解过程分成两部分 第一 ...

  5. [IBM DB2] db2 terminate 和 db2 connect reset 有什么区别?

    [IBM DB2] db2 terminate 和 db2 connect reset 有什么区别?  总结:如果是退出编辑器 quit :如果是断开数据库连接释放资源 connect reset : ...

  6. UpdatePanel完成后调用js

    引言: asp.net 微软引入了UpdatePanel 使用起来很方便 如果 我们想UpdatePanel加载完成后做一些事情 需要使用js <script type="text/j ...

  7. OSG使用更新回调来更改模型

    OSG使用更新回调来更改模型 转自:http://blog.sina.com.cn/s/blog_668aae7801017gl7.html 使用回调类实现对场景图形节点的更新.本节将讲解如何使用回调 ...

  8. 如何用PHP开发机器人。

    近段时间由于工作需要,需要写个QQ通知的功能,仔细百度了一下,发现了现有的码,现分享大家.特别应该注意的是腾讯公司并未提供过QQ直接通讯的API接口,不过很庆幸的是咋们还有个3g qq可以小小利用下, ...

  9. [LintCode] Create Maximum Number 创建最大数

    Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum numb ...

  10. Hibernate中易错地方的总结

    1.Hibernate中的配置文件要放在src下,注意不能放在包目录下 2.Hibernate中@Before   @After方法不能再普通的类里用,只有在专门的JUnit测试用例里面用. 3.使用 ...