在Linux下的C/C++中,我需要分配一个大的(几千兆字节)内存块,以便存储连接到以太网端口的传感器的实时数据和大约110MB/s的流数据.我想分配尽可能多的内存,以最大化我可以存储的数据序列的长度.但是,我还需要确保不会进行磁盘交换,因为产生的延迟和磁盘访问带宽有限会导致传感器(非常有限)的缓冲区溢出.
确定要分配多少内存的最佳方法是什么?我仅限于分配比报告的可用内存稍小的块,还是可以更直接地与linux虚拟内存管理器连接?
我一直试图把我的脑袋包裹起来.由于我将在这个特定的市场中自学成才,我意识到在该领域找到一份工作会更难,所以我希望在我的简历中添加一个完整的项目,向潜在的雇主证明我已经完成了并且可以为他们再做一次.
有人可以建议一个我可以作为一个人进行的项目,并且实际上能够完成,但同时又不是太简单,它没有证明什么?我可以瞄准的合理的东西.
如果你能用你自己工作的项目来证实你的例子,并提到有多少人参与,以及完成它需要多长时间,那也可以帮助我衡量我一般看到的项目的难度并排除那些项目的难度.这对我的能力来说可能太大了.很难衡量项目从我的职位所需的工作量.
在回答另一个问题时,我想到了以下示例:
void *p;
unsigned x = 17;
assert(sizeof(void*) >= sizeof(unsigned));
*(unsigned*)&p = 17; // (1)
memcpy(&p, &x, sizeof(x)); // (2)
Run Code Online (Sandbox Code Playgroud)
第1行打破了别名规则.然而,第2行是好的.别名规则.问题是:为什么?编译器是否具有关于memcpy等函数的特殊内置知识,还是有一些其他规则可以使memcpy正常运行?有没有办法在标准C中实现类似memcpy的函数而不破坏别名规则?
在C中使用未定义的结构有什么好处吗?
SQLite源代码中的示例:
/* struct sqlite3_stmt is never defined */
typedef struct sqlite3_stmt sqlite3_stmt;
Run Code Online (Sandbox Code Playgroud)
对象被操纵如下:
typedef struct Vdbe Vdbe;
struct Vdbe {
/* lots of members */
};
int sqlite3_step(sqlite3_stmt *pStmt) {
Vdbe *v = (Vdbe*) pStmt;
/* do stuff with v... */
}
Run Code Online (Sandbox Code Playgroud)
那么,为什么不直接使用通常的抽象类型,在私下定义的实际结构foo.c源和公众typedef的foo.h头?
我正在开发一个游戏引擎,我为编写多种格式的图像加载器太麻烦了,所以我的问题是:是否有一个抽象的图像加载库来加载图像文件?我只需要加载文件然后使用像素数组将它们打印到屏幕上.
我知道我可以使用这些函数的默认最大缓冲区大小是65507(5535 - IPv4标头 - UDP标头).但是,有没有办法改变这个?我需要能够发送更大的缓冲区~66000字节.我尝试使用setsockopt()函数,但似乎没有用.
谢谢!
复制包含char数组的两个结构的标准方法是什么?
这是一些代码:
#include stdio.h>
#include string.h>
#include stdlib.h>
typedef struct {
char* name;
char* surname;
} person;
int main(void){
person p1;
person p2;
p1.name = (char*)malloc(5);
p1.surname = (char*)malloc(5);
strcpy(p1.name, "AAAA");
strcpy(p1.surname, "BBBB");
memcpy(&p2, &p1, sizeof(person));
free(p1.name);
printf("%s\n", p2.name);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该行printf("%s\n", p2.name);不打印,因为我释放了缓冲区.
我的结构的问题是它们比struct更大person.它们包含数百个char指针,我必须逐个复制每个成员.
是否有另一种方法来复制包含char数组的两个结构而不使用malloc和strcpy为每个成员?
我正在构建一个内核模块中的一些结构略有问题,所以我认为如果有一种简单的方法来打印结构及其值,那将是很好的 - 以下是一个很小的用户态的例子我的意思.
假设我们有如下的简单C示例(以bash命令的形式给出):
FN=mtest
cat > $FN.c <<EOF
#include <stdio.h> //printf
#include <stdlib.h> //calloc
struct person
{
int age;
int height;
};
static struct person *johndoe;
main ()
{
johndoe = (struct person *)calloc(1, sizeof(struct person));
johndoe->age = 6;
asm("int3"); //breakpoint for gdb
printf("Hello World - age: %d\n", johndoe->age);
free(johndoe);
}
EOF
gcc -g -O0 $FN.c -o $FN
# just a run command for gdb
cat > ./gdbcmds <<EOF
run
EOF
gdb --command=./gdbcmds ./$FN
Run Code Online (Sandbox Code Playgroud)
如果我们运行这个例子,程序将编译,gdb将运行它,并自动停在断点处.在这里我们可以做到以下几点:
Program received signal …Run Code Online (Sandbox Code Playgroud) 我的程序(文本模式Web浏览器)动态分配内存.
当然,我在运行时释放不需要的块.并且我在正常终止之前释放所有内容 - 因此内存泄漏检查器不会给我误报(并且如果需要进行重大重构则要灵活).
现在,我也不会做的是异常终止之前释放内存.(目前,我的程序在信号和mallocs/reallocs失败后终止.)
我的问题是:你认为这种不好的风格吗?我应该免费异常终止吗?