注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[gtk+][GLib] GLib入门(1)  

2009-05-17 14:33:08|  分类: gui_X |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
GLib, GTK+ 中的一个基础库,用于隔离平台相关的一些特性,比如:线程、IO 等等。
Makefile (OpenBSD 4.5)
------------------------------------
CFLAGS=`pkg-config --cflags glib-2.0` -Wall -pedantic
LIBS=-lpthread `pkg-config --libs glib-2.0`

all:
        gcc ${CFLAGS} main.c ${LIBS}
------------------------------------

GLib Basic
数据类型
gboolean, gchar(guchar), gdouble, gfloat, gint(guint), gint8(guint8), ...
Data Type 的隔离,是平台无关的第一步。

GLib版本
假设 Version = 2.12.3
GLIB_MAJOR_VERSION = 2  (guint)
GLIB_MINOR_VERSION = 12
GLIB_MICRO_VERSION = 3
GLIB_CHECK_VERSION(a, b, c), a.b.c <= 2.12.3,则返回 TRUE

常用 Macro Func
ABS(a)
CLAMP(a, low, high)        CLAMP(a, 100, 200)
G_DIR_SEPARATOR
G_DIR_SEPARATOR_S          "foo"G_DIR_SEPARATOR_S"bar"
MIN(a, b)
MAX(a, b)

常用 Macro Var
G_OS_WIN32, G_OS_BEOS, G_OS_UNIX
TRUE, FALSE

常用数学 Macro Var
G_E
G_LN2, G_LN10
G_PI, G_PI_2(pi/2), G_PI_4(pi/4)
G_SQRT2
G_LOG_2_BASE_10

Message Logging
void g_log(const gchar *log_domain, GLogLevelFlags log_level,
    const gchar *message, ...);

GLogLevelFlags
G_LOG_FLAG_RECURSION
G_LOG_FLAG_FATAL
G_LOG_LEVEL_ERROR
G_LOG_LEVEL_CRITICAL
G_LOG_LEVEL_WARNING
G_LOG_LEVEL_MESSAGE
G_LOG_LEVEL_INFO
G_LOG_LEVEL_DEBUG
G_LOG_LEVEL_MASK = (G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL)

如果觉得用 g_log() 比较麻烦,可以用下面的 wrapper,不过不能指定 log_domain 了
void g_message(...);
void g_warning(...);
void g_critical(...);
void g_error(...);
void g_error(...);

可以让程序在出现某个 level 的时候,直接 abort() 掉
g_log_set_always_fatal(G_LOG_LEVEL_DEBUG | G_LOG_LEVEL_WARNING);
------------------------------------
int main()
{
        g_log_set_always_fatal(G_LOG_LEVEL_DEBUG);
        g_warning("Before Fuck!");
        g_critical("Fuck!");
        g_log("KS", G_LOG_LEVEL_DEBUG, "good!");

        printf("pi: %f\n", G_PI);

        return 0;
}
------------------------------------
$ ./a.out                                                                     
** (process:30714): WARNING **: Before Fuck!
** (process:30714): CRITICAL **: Fuck!
KS-DEBUG: good!
aborting...
Abort trap (core dumped)
------------------------------------

Memory Management
Memory Slices
GLib 中有多种 memory management 的东东,不过这里只介绍最新加入的特性——slice。
其实就是一种 slab allocation,你申请要 N-size 的一个对象,分配器内部为你准备好一堆,下次再要同样大小的对象,分配操作就很迅速了。
------------------------------------
#include <glib.h>
#include <string.h>
#define    SLICE_SIZE    10

int main()
{
    gchar *strings[100];
    gint i;

    for ( i = 0; i < 100; i++ )
        strings[i] = g_slice_alloc(SLICE_SIZE);

    strlcpy(strings[0], "hello", SLICE_SIZE);
    g_print("s[0] = %s\n", strings[0]);

    for ( i = 0; i < 100; i++ )
        g_slice_free1(SLICE_SIZE, strings[i]);        // NOTE: _free1

    return 0;
}
------------------------------------
g_slice_alloc(n)    - 申请 n bytes
g_slice_alloc0(n)   - 申请 n bytes,并且 bzero
g_slice_free1(n, p) - 释放 p 所指上的内存 n bytes

g_slice_new(type)     - ((type *) g_slice_alloc(sizeof(type))
g_slice_new0(type)    - g_slice_new && bzero
g_slice_free(type, p) - g_slice_free1(sizeof(type), p)

注意这里 _free / _free1 不要用错了。

Memory Allocation
GLib还对标准的 C func 做了一些 portable wrapper。
struct_type* g_new(struct_type, number_of_structs);
gpointer g_malloc(gulong bytes);    // 分配失败 abort()
gpointer g_try_malloc(gulong bytes);    // 分配失败 return NULL
void g_free(gpointer memory);
void *g_memmove(void *dest, const void *src, guint count);

Memory Profiling
GLib 自己有个啥 GMemVTable,不过还是推荐用 valgrind。
------------------------------------
#include <glib.h>

int main()
{
    GSList *list = NULL;

    g_mem_set_vtable(glib_mem_profiler_table);
    g_atexit(g_mem_profile);

    list = (GSList*) g_malloc(sizeof(GSList));
    list->next = (GSList*) g_malloc(sizeof(GSList));

    g_free(list->next);
    return 0;
}
------------------------------------
$ ./a.out                                                                     
GLib Memory statistics (successful operations):
 blocks of | allocated  | freed      | allocated  | freed      | n_bytes  
  n_bytes  | n_times by | n_times by | n_times by | n_times by | remaining
           | malloc()   | free()     | realloc()  | realloc()  |          
===========|============|============|============|============|===========
         8 |          2 |          1 |          0 |          0 |         +8
GLib Memory statistics (failing operations):
 --- none ---
Total bytes: allocated=16, zero-initialized=0 (0.00%), freed=8 (50.00%), remaining=8
------------------------------------

  评论这张
 
阅读(1688)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017