Tag: memcpy

针对Core 2或Core i7架构进行全面优化的memcpy / memmove?

具有DDR3双通道内存的Core 2处理器的理论最大内存带宽令人印象深刻:根据维基百科关于架构的文章 ,每秒10+或20+千兆字节。 但是,库存memcpy()调用不会达到此目的。 (3 GB / s是我在这样的系统上看到的最高。)可能,这是由于OS供应商要求memcpy()根据处理器的特性针对每个处理器线进行调整,因此库存memcpy()实现在众多品牌和产品线上应该是合理的。 我的问题:是否有可以在C程序中使用的Core 2或Core i7处理器的免费高度调整版本? 我确信我不是唯一一个需要一个人的人,对每个人来说微量优化他们自己的memcpy()将是一个很大的浪费。

copy_to_user vs memcpy

我一直被告知(在书籍和教程中),在将数据从内核空间复制到用户空间时,我们应该使用copy_to_user()并使用memcpy()会给系统带来问题。 最近我错误地使用了memcpy(),它可以很好地解决任何问题。 为什么我们应该使用copy_to_user而不是memcpy() 我的测试代码(内核模块)是这样的: static ssize_t test_read(struct file *file, char __user * buf, size_t len, loff_t * offset) { char ani[100]; if (!*offset) { memset(ani, ‘A’, 100); if (memcpy(buf, ani, 100)) return -EFAULT; *offset = 100; return *offset; } return 0; } struct file_operations test_fops = { .owner = THIS_MODULE, .read = test_read, }; static […]

当memcpy()比memmove()更快时,真正的重要案例是什么?

memcpy()和memmove()之间的关键区别在于,当源和目标重叠时, memmove()将正常工作。 当缓冲区肯定不重叠时, memcpy()更可取,因为它可能更快。 困扰我的是这个潜在的 。 它是一个微优化还是当memcpy()更快时有真正重要的例子,所以我们真的需要使用memcpy()而不是到处都有memmove() ?

C strcpy() – 邪恶?

有些人似乎认为C的strcpy()函数是坏的还是邪恶的。 虽然我承认通常最好使用strncpy()以避免缓冲区溢出,但以下( strdup()函数的实现对于那些不够幸运的人来说)安全地使用strcpy()并且永远不会溢出: char *strdup(const char *s1) { char *s2 = malloc(strlen(s1)+1); if(s2 == NULL) { return NULL; } strcpy(s2, s1); return s2; } *s2保证有足够的空间来存储*s1 ,并且使用strcpy()我们不必将strlen()结果存储在另一个函数中,以便稍后用作strncpy()的不必要(在本例中)长度参数。 然而有些人用strncpy()甚至memcpy()编写这个函数,它们都需要一个length参数。 我想知道人们对此的看法。 如果您认为strcpy()在某些情况下是安全的,请说明。 如果你有充分的理由不在这种情况下使用strcpy() ,请给它 – 我想知道为什么在这种情况下使用strncpy()或memcpy()会更好。 如果你认为strcpy()没问题,但不在这里,请解释一下。 基本上,我只是想知道为什么有些人在使用strcpy()时会使用memcpy() ,而其他人则使用plain strncpy() 。 是否有任何逻辑可以优先选择三个(忽略前两个的缓冲区检查)?

请查看重叠内存块的memcpy()的这种莫名其妙的行为和输出

在阅读了关于memcpy()的以下内容之后,我继续阅读有关memmove() : To avoid overflows, the size of the arrays pointed by both the destination and source parameters, shall be at least num bytes, and should not overlap (for overlapping memory blocks, memmove is a safer approach). (链接) 在检查用于说明memmove()的工作的程序之后,我决定使用memcpy()来调整它,而不是看看输出有多么不同。令我惊讶的是,它们是相同的,即使它是重叠内存块的情况这是程序和输出,之后我开始描述我的困惑: #include #include int main () { char str[] = “memmove can be very useful……”; //memmove (str+20,str+15,11); […]

从未初始化的变量memcpy是未定义的行为吗?

是否使用未初始化的变量作为C中memcpy未定义行为的src ? void foo(int *to) { int from; memcpy(to, &from, sizeof(from)); }

memcpy是否安全?

我在网上看了一眼,无法满足自己的答案。 memcpy线程安全吗? (在Windows中) 我的意思是,如果我使用单个memcpy写入进程之间共享的内存区域(使用boost :: shared_memory_object),然后尝试使用单个memcpy从另一个进程读取该区域,那么将在写入时自动阻止一个进程发生了什么? 我在哪里可以读到这个?

memcpy(),size参数的值应该是多少?

我想将一个int数组复制到另一个int数组。 它们使用相同的长度定义,因此它们的长度始终相同。 memcpy()的size参数的以下两个替代方案的优缺点是什么? memcpy(dst, src, ARRAY_LENGTH*sizeof(int)); 要么 memcpy(dst, src, sizeof(dst)); 第二种选择总能奏效吗? 无论内容如何? 有利于最后一个的一件事是,如果arrays要改变,那么更新memcpy()会有一些内容。 谢谢

使用赋值而不是memcpy()在C中复制结构

直到最近,我才看到用memcpy()复制结构字段。 在类和在线指令中,将一个结构的内容复制到另一个结构中通常看起来像 struct block *b0 = malloc(sizeof(struct block)); struct block *b1 = malloc(sizeof(struct block)); /* populate fields in *b0 */ memcpy(b1, b0, sizeof *b1); /* copy contents of b0 into b1 */ /* free b0, b1 */ 但是,也可以通过替换memcpy()的简单赋值来完成此任务。 *b1 = *b0; /* dereferenced struct assignment */ 有没有充分的理由说明为什么它没有被广泛使用(至少在我有限的经验中)? 这两个方法是赋值和memcpy()等价,还是有一些令人信服的理由一般使用memcpy() ?

取消引用包含对象地址(数组数组)的出界指针

对于不同的REF值,以下是否定义明确? #include #define REF 1 #define S 1 int main(void) { int a[2][S] = {{1},{2}}; int *q = REF ? a[1] : 0; int *p = a[0] + S; memcpy (&q, &p, sizeof q); printf (“q[0] = %d\n”, q[0]); return 0; } 注意, p指向a[0]的最后一个元素之后,而不指向数组a[0]的元素,因此不能解引用。 但存储在p中的地址a[1][0]的地址。 p语义(故意?)指向“到”(嗯,出) a[0] 但物理上指向a[1] 。 当原始物理上只有一个指针的位模式的副本可以在语义上指向一个对象吗? 也可以看看 我用不同的“角度”问了基本相同的C / C ++问题: […]