在诸如游戏开发,实时系统等的某些开发领域中,具有快速且优化的程序是重要的.另一方面,现代编译器已经进行了大量优化,并且在一个需要考虑截止日期的世界中,在汇编中进行优化可能非常耗时.
在C/C++程序中使用Assembly优化某些功能真的值得吗?
使用今天的现代编译器使用Assembly优化C/C++程序时,是否真的有足够的性能提升?
我对所发布的答案有所了解,在嵌入式系统,多媒体编程(图形,声音等)等特定领域,任何可以获得的收益都很重要.此外,人们需要能够(或有能力)在装配中做得比现代编译器更好.做一些真正优化的C/C++可以花费更少的时间并且可以做得足够好.最后一点,学习汇编可以帮助理解程序的内部机制,并最终使某人成为更好的程序员.
就CPU周期而言,malloc()的成本是多少?(Vista/OS,最新版gcc,最高优化级别......)
基本上,我正在实现一个复杂的DAG结构(类似于链表),它由一些16B(不太常见)和20B节点(更常见)组成.
偶尔,我将删除一些节点,然后添加一些节点.但是,我可以简单地将不需要的节点移动到我的数据结构的末尾,然后在我的算法继续时更新字段,而不是总是使用malloc()和free().如果有空闲节点,我将更新字段; 如果没有,我将不得不分配一个新的.
问题是,我可能只有一个可用节点,而必须输入,例如,20个节点的数据.这意味着:
问题:真的值得吗?我应该像往常一样使用malloc()和free(),还是值得在列表末尾保留一些空闲节点,并且即使它通常会失败并继续检查malloc()也值得检查?
更具体地说,
malloc()的CPU成本是多少?
我在这里看一些C源代码,我发现了这个:
fprintf(stderr, _("Try `%s --help' for more information.\n"), command);
Run Code Online (Sandbox Code Playgroud)
当我看到wxWidget时,我已经看到了下划线,我读到它用于国际化.我发现它真的很可怕(有史以来最不直观的名字),但我认为它只是另一种奇怪的wxWidget惯例.
现在我在一些Alsa源中再次找到它.有谁知道它来自哪里?
这两种风格:
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项目.我有一个LCD显示屏,每个字符有一个5x7点阵.要显示特定字符,您必须移动5个字节,与要打开的点相关联.所以我需要使用一个键来制作某种查找表,我可以传入一个ASCII字符,然后返回一个包含5个字节的数组...例如,调用这个函数就像这样,
GetDisplayBytes('A');
应该返回`这样的数组......
C[0] = 0x7E : C[1] = 0x90 : C[2] = 0x90 : C[3] = 0x90 : C[4] = 0x7E
在C中这样做的最佳方法是什么?
如何在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套接字,并保证即使字节序不同,也可以在其他机器上反序列化.是否有任何其他"最佳实践"来执行此功能,因为我必须序列化整数,双精度数,浮点数和字符*?
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?
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)
如何将数据写入字符串流而不是文件流?
在阅读序列点后,我了解到这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限制吗?这是"严格"的意思吗?