标签: c

在C/C++程序中使用Assembler优化某些功能真的值得吗?

在诸如游戏开发,实时系统等的某些开发领域中,具有快速且优化的程序是重要的.另一方面,现代编译器已经进行了大量优化,并且在一个需要考虑截止日期的世界中,在汇编中进行优化可能非常耗时.

问题:

  1. 在C/C++程序中使用Assembly优化某些功能真的值得吗?

  2. 使用今天的现代编译器使用Assembly优化C/C++程序时,是否真的有足够的性能提升?


我对所发布的答案有所了解,在嵌入式系统,多媒体编程(图形,声音等)等特定领域,任何可以获得的收益都很重要.此外,人们需要能够(或有能力)在装配中做得比现代编译器更好.做一些真正优化的C/C++可以花费更少的时间并且可以做得足够好.最后一点,学习汇编可以帮助理解程序的内部机制,并最终使某人成为更好的程序员.

c c++ optimization assembly

12
推荐指数
4
解决办法
1962
查看次数

malloc cpu周期

就CPU周期而言,malloc()的成本是多少?(Vista/OS,最新版gcc,最高优化级别......)

基本上,我正在实现一个复杂的DAG结构(类似于链表),它由一些16B(不太常见)和20B节点(更常见)组成.

偶尔,我将删除一些节点,然后添加一些节点.但是,我可以简单地将不需要的节点移动到我的数据结构的末尾,然后在我的算法继续时更新字段,而不是总是使用malloc()和free().如果有空闲节点,我将更新字段; 如果没有,我将不得不分配一个新的.

问题是,我可能只有一个可用节点,而必须输入,例如,20个节点的数据.这意味着:

  • 我将检查可用的免费节点
  • 检查将成功,并且该免费节点将更新
  • 我将多次检查可用节点19
  • 所有检查都将失败,并且每次都会调用malloc()

问题:真的值得吗?我应该像往常一样使用malloc()和free(),还是值得在列表末尾保留一些空闲节点,并且即使它通常会失败并继续检查malloc()也值得检查?

更具体地说,

malloc()的CPU成本是多少?

c

12
推荐指数
2
解决办法
6849
查看次数

下划线功能

我在这里看一些C源代码,我发现了这个:

fprintf(stderr, _("Try `%s --help' for more information.\n"), command);
Run Code Online (Sandbox Code Playgroud)

当我看到wxWidget时,我已经看到了下划线,我读到它用于国际化.我发现它真的很可怕(有史以来最不直观的名字),但我认为它只是另一种奇怪的wxWidget惯例.

现在我在一些Alsa源中再次找到它.有谁知道它来自哪里?

c internationalization

12
推荐指数
3
解决办法
2537
查看次数

为什么在*struct定义之后使用typedef*?

这两种风格:

struct _something
{
   ...
};
typedef struct _something someting;
Run Code Online (Sandbox Code Playgroud)

那种风​​格:

typedef struct _something
{
  ...
} something;
Run Code Online (Sandbox Code Playgroud)

是C中正确的typedef声明.
请注意,文件中存在结构声明是故意的:我需要访问其他地方的结构的内部组件.

第一个声明的一个缺点是,当您使用任何IDE时,自动"跳转到声明"通常会将您引导到typedef struct _something someting;而不是直接为您提供真实的结构定义.

在第二种方法中,您可以直接进入结构定义.

是否有人会使用第一种方法?
我正在处理的代码充满了这些......
维护者只是一个坏/好的习惯?

c struct typedef

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

在C中执行查找表的最佳方法是什么?

我正在开发一个嵌入式C项目.我有一个LCD显示屏,每个字符有一个5x7点阵.要显示特定字符​​,您必须移动5个字节,与要打开的点相关联.所以我需要使用一个键来制作某种查找表,我可以传入一个ASCII字符,然后返回一个包含5个字节的数组...例如,调用这个函数就像这样,

GetDisplayBytes('A');

应该返回`这样的数组......

C[0] = 0x7E : C[1] = 0x90 : C[2] = 0x90 : C[3] = 0x90 : C[4] = 0x7E

在C中这样做的最佳方法是什么?

c lookup-tables

12
推荐指数
1
解决办法
3万
查看次数

用C序列化double和float

如何在C中序列化双打和浮点数?

我有以下代码来序列化short,int和chars.

unsigned char * serialize_char(unsigned char *buffer, char value)
{
    buffer[0] = value;
    return buffer + 1;
}

unsigned char * serialize_int(unsigned char *buffer, int value)
{
    buffer[0] = value >> 24;
    buffer[1] = value >> 16;
    buffer[2] = value >> 8;
    buffer[3] = value;
    return buffer + 4;
}

unsigned char * serialize_short(unsigned char *buffer, short value)
{
    buffer[0] = value >> 8;
    buffer[1] = value;
    return buffer + 2;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我从这个问题中找到了这些功能

编辑2:

序列化的目的是将数据发送到UDP套接字,并保证即使字节序不同,也可以在其他机器上反序列化.是否有任何其他"最佳实践"来执行此功能,因为我必须序列化整数,双精度数,浮点数和字符*?

c floating-point serialization

12
推荐指数
5
解决办法
1万
查看次数

什么是C字符串和C++字符串之间的区别?

什么是C Strings和C++字符串之间的区别.特别是在进行动态内存分配时

c c++ string

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

realloc如何知道要复制多少?

realloc如何知道原始数据的大小?

 void *realloc(void *ptr, size_t size);
Run Code Online (Sandbox Code Playgroud)

所以,如果实现是这样的:

 temp = malloc(size);
 memcpy(.. // How much to copy?
 free(ptr);
 return temp;
Run Code Online (Sandbox Code Playgroud)

我意识到这不是最初的实现,并且realloc并不总是免费,但是当它发生时,它复制了多少?

编辑:谢谢你的回答.但是,如何在我的代码中使用malloc/free/..实现realloc?

c realloc

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

C中的字符串流

print2fp(const void *buffer, size_t size, FILE *stream) {

 if(fwrite(buffer, 1, size, stream) != size)
  return -1;

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

如何将数据写入字符串流而不是文件流?

c string stdio stream

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

当p和q指向同一个对象时,"*p = ++(*q)"是否未定义?

在阅读序列点后,我了解到这i = ++i是未定义的.

那么这段代码怎么样:

int i;
int *p = &i;
int *q = &i;
 *p = ++(*q);           // that should also be undefined right?
Run Code Online (Sandbox Code Playgroud)

假设p和q的初始化取决于某些(复杂)条件.他们可能像上面的情况一样指向同一个对象.会发生什么?如果未定义,我们可以使用哪些工具进行检测?

编辑:如果两个指针不应该指向同一个对象,我们可以使用C99限制吗?这是"严格"的意思吗?

c c99 operator-precedence sequence-points

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