小编kin*_*kai的帖子

为什么malloc + memset比calloc慢?

众所周知,它与初始化分配的内存calloc不同malloc.使用时calloc,内存设置为零.使用时malloc,内存不会被清除.

所以在日常工作中,我认为callocmalloc+ memset.顺便说一下,为了好玩,我为基准编写了以下代码.

结果令人困惑.

代码1:

#include<stdio.h>
#include<stdlib.h>
#define BLOCK_SIZE 1024*1024*256
int main()
{
        int i=0;
        char *buf[10];
        while(i<10)
        {
                buf[i] = (char*)calloc(1,BLOCK_SIZE);
                i++;
        }
}
Run Code Online (Sandbox Code Playgroud)

代码1的输出:

time ./a.out  
**real 0m0.287s**  
user 0m0.095s  
sys 0m0.192s  
Run Code Online (Sandbox Code Playgroud)

代码2:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BLOCK_SIZE 1024*1024*256
int main()
{
        int i=0;
        char *buf[10];
        while(i<10)
        {
                buf[i] = (char*)malloc(BLOCK_SIZE);
                memset(buf[i],'\0',BLOCK_SIZE);
                i++;
        }
}
Run Code Online (Sandbox Code Playgroud)

代码2的输出:

time ./a.out   
**real 0m2.693s**  
user 0m0.973s  
sys 0m1.721s  
Run Code Online (Sandbox Code Playgroud)

更换 …

c malloc

249
推荐指数
2
解决办法
5万
查看次数

为什么C评论喜欢/**/需要'<'?

我的团队C代码指南写道,最好在注释中放置一个'<',如下所示:

#define MAX_PACK_ITEM_NUM 50  /**<  max number of item */
Run Code Online (Sandbox Code Playgroud)

我想知道,这个'<'的实际用途是什么?

c c++ doxygen

47
推荐指数
4
解决办法
2691
查看次数

func可以获得自称的lineno吗?(C/C++)

我有一个问题,因为下面的代码描述了自己.

1  #include<stdlib.h>
2  #include<stdio.h>
3  void log()
4  {
5         printf("Log [Line:%d]\n",__LINE__);
6  }
7  int main()
8  {
9         log();
10        log();
11 }
Run Code Online (Sandbox Code Playgroud)

预期的结果是
Log [Line:9]
Log [Line:10]
但是,事实是
Log [Line:5]
Log [Line:5]

毫不奇怪,LINE在预处理阶段被替换为5.
我的问题是,如何设计日志函数以获得预期结果?
谢谢!

c c++

6
推荐指数
1
解决办法
1303
查看次数

动态绑定还是开关/案例?

像这样的场景:
我有不同的对象执行与各自func()实现的类似操作.
func_manager()有两种解决方案可以根据不同的对象调用func()

解决方案1:使用c ++中指定的虚函数字符.func_manager以不同的方式对不同的对象点传入进行工作.

class Object{
  virtual void func() = 0;
}
class Object_A : public Object{
  void func() {};
}
class Object_B : public Object{
  void func() {};
}
void func_manager(Object* a)
{
   a->func();
}
Run Code Online (Sandbox Code Playgroud)

解决方案2:使用普通开关/外壳.func_manager的工作原理与不同类型的传入不同

typedef enum _type_t
{
  TYPE_A,
  TYPE_B
}type_t;

void func_by_a()
{
// do as func() in Object_A
}
void func_by_b()
{
// do as func() in Object_A
}
void func_manager(type_t type)
{
    switch(type){
        case TYPE_A:
            func_by_a();
            break;
        case TYPE_B:
            func_by_b();
        default: …
Run Code Online (Sandbox Code Playgroud)

c c++ design-patterns switch-statement

1
推荐指数
1
解决办法
2028
查看次数

想知道一些#define技巧

在阅读我的小组项目的代码时,我遇到了许多DEFINE,其中一些似乎很奇怪.要概括它,请查看以下2个示例.

例1:

#define SNPRINTF(dst, fmt, arg...)  snprintf(dst, sizeof(dst), fmt, ##arg)
Run Code Online (Sandbox Code Playgroud)

"##"在这种情况下意味着什么?我试图删除他们两个,并写这样的代码 "字符BUF [1024]的snprintf(buf中," %S%S " "ABCD", "EFG");" 这产生了相同的结果.所以"##"似乎毫无用处,对我没有任何伤害.

例2:

#define CLOSE(fd)   do  {   \
        if (-1 != (fd)) {   \
                    close(fd);  \
                    (fd)    = -1;   \
                }   \
} while (0)
Run Code Online (Sandbox Code Playgroud)

有必要将内部代码填充到do{}while(0)语句中吗?什么用途?

c c-preprocessor

1
推荐指数
1
解决办法
949
查看次数