memcpy 相关问题

memcpy()是一个C标准库函数,用于将一块内存字节从一个地方复制到另一个地方。

Swift:memcpy 复制带有偏移量的数组

我有一个巨大的数组,我只想复制它的中间部分。我正在尝试使用 memcpy 来提高性能,但找不到这样做的方法。下面是一个例子。我们如何提供关闭...

回答 0 投票 0

C++ 类中的内部指针在 o 外丢失

我有小班包含 char* 成员(简化): `类字节实体{ 民众: // ... 一些其他成员... 字符*数据; 字节实体(); 字节实体(int i); 字节实体...

回答 0 投票 0

将向量映射到结构化缓冲区会在计算着色器中给出不正确的值

我在计算着色器中有一个结构化缓冲区,它应该保存关于几个灯光、位置、方向、颜色等的信息。我已经设法将信息输入到计算着色器中,但是...

回答 0 投票 0

理解 memcpy

int a = 10; int* pA = &a; 长长 b = 200; 长长* pB = &b; memcpy (pB,pA,4); memcpy (pB+1,pA,4); 计算<<"I'm a memcpy!: "<<*(pB)< int a = 10; int* pA = &a; long long b = 200; long long* pB = &b; memcpy (pB,pA,4); memcpy (pB+1,pA,4); cout<<"I'm a memcpy!: "<<*(pB)<<endl; 我正在用 memcpy 做一些测试来自学记忆是如何工作的。我想做的是使 b = 为“1010”。我可以将值从 a 复制到 b,但随后我尝试将内存偏移 1 个字节并写入另一个 10,但它不起作用,它只输出“10”。 我需要做什么才能获得 1010 的值? 您的代码目前存在的一些问题: 你复制了 4 个字节,但目的地是类型 int。由于 int 不能保证是任何特定的大小,因此在执行那种 memcpy. 之前,您需要确保它至少有 4 个字节长 memcpy 在字节级别上工作,但整数是一系列字节。根据您的目标体系结构,整数中的字节可能会以不同方式排列(大端、小端等)。在整数上使用 memcpy 可能会也可能不会达到您的预期。学习memcpy和朋友如何工作时最好使用字节数组。 你的第二个memcpy使用pB+1作为目标。这不会将指针前进一个字节,而是将其前进 sizeof(*pB) 字节。在这种情况下,它会指向一个无效地址(超过变量的末尾)。对 memcpy 的调用会损坏随机内存,这可能会使您的程序崩溃或导致不可预知的结果。 我不认为memcpy()是为你想要的而设计的。通常,您会使用 memcpy() 复制一个或多个完整对象(其中对象可能是 int、char、long long 等) int a[4] = { 1, 2, 3, 4 }; int b[3]; int c[5] = { 0 }; ::memcpy(b, a, 3 * sizeof(int)); // b is { 1, 2, 3 } ::memcpy(c+2, b, 3 * sizeof(int)); // c is { 0, 0, 1, 2, 3 } c+2 不是“c + 2 字节”。它是“c + 2 ints”(在 Win32/x86 系统上是 8 个字节)。 你 can 通过转换为 char 或 unsigned char 指针来访问单个字节,但我不建议这样做,除非你真的明白你在做什么,因为有很多陷阱。 unsigned x = 0; unsigned char *px = reinterpret_cast<unsigned char *>(&x); px[0] = 0xFF; px[2] = 0xAA; 这里的一个危险是,您假定了解计算机如何存储整数。在 x86 系统上,x 将是 0x00AA00FF,但在 Sun Sparc 系统上它将是 0xFF00AA00。 如果您需要设置整数的一部分,通常最好使用“or”和“shift”。 x = (0xFF<<24) | (0xAA<<8); 在任何架构上都会给你 0xFF00AA00。 0xFF<<24 shifts the value 0xFF by 24 bits to the left, making 0xFF000000. 0xAA<<8 shifts the value 0xAA by 8 bits to the left, making 0x0000AA00. 我们将它们“或”在一起,给出 0xFF00AA00。 研究指针算法:http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/pointer.html。向指针添加一个值实际上会增加您正在处理的任何大小的许多单位。 pB 的类型为 long long*,因此向其加 1 将为变量 b 后的下一组八个字节提供地址。 pB[0] 是变量 b,但 pB[1](相当于 pB+1)指向未定义的内存。写入它可能会导致崩溃。 替换 long long b; 与 long long b[2]; (使用您喜欢的任何初始值) 您的 cout 需要同时提供 b[0] 和 b[1]。 如果你想把“10”复制到后面的字节中得到“1010”,你想复制字符串。这确实是 strcat() 的工作,而不是 memcpy(),但这里有一种方法可以用 memcpy() 来完成: #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { constexpr char src[] = "10"; constexpr size_t n = sizeof(src) - 1; // Don’t count the terminator. char dest[2*n+1] = {'\0'}; // Will hold: {'1','0','1','0','\0'} static_assert( sizeof(dest) > 2*n, "" ); // Always check array bounds in C++! memcpy( dest, src, n ); memcpy( dest + n, src, n ); puts(dest); return EXIT_SUCCESS; } 特别注意,目标是一个字节数组,长度足以容纳两个副本。 我没有 >= 50 的声誉分数,所以我不能发表评论,即使作为评论帖子的原作者 -> 从我的角度来看,这简直是愚蠢的...... 所以,这是我对 user207421 发表的评论的回答: SIMD 指令在过去 20 年(至少)中在 PC 中使用的每个 CPU 中实现,因此除非您使用一些非常旧的 CPU,否则您关于“足够新”的 CPU 的声明基本上是无效的。 参见我上面帖子中的第 2 点:“最快的架构相关方法”意味着 f.e.在 8 位 AVR 上,“movw”指令可以(并且已经)用于实现类似 memcpy 的快速函数,因为它的工作方式类似于 x86 上的 SIMD:它可以在一个周期内复制 2 个 8 位 CPU 字. 问候。 memcpy 在字节级别上工作,但整数是一系列字节。 错误的解释。 对于strcpy(),上面的答案或多或少是正确的,但对于memcpy(),这是完全错误的,因为所有mem_xxx()函数都使用SIMD指令来加速操作。 如果 memcpy() 函数基于逐字节复制,那将非常慢... 基本上所有的mem_xxx功能都是这样实现的: 如果源和/或目标指针未对齐,则这些函数通过首先处理未对齐/奇数内存块来对齐指针。 接下来,使用最快的架构相关方法来处理对齐的内存区域。 最后,处理剩余的未对齐/奇数字节。 我建议在发布错误答案之前实际read代码。

回答 7 投票 0

C6387 用于 memcpy、strcpy 和 strcpy_s

C6387的warning我好像甩不掉。 typedef 结构 HashBind{ 字符* cKeyIdentifier; void* vValue; } 哈希绑定; .... HashBind* strNewBind = malloc(sizeof(HashBind)); strN...

回答 1 投票 0

为了保留 n 个先前的值,memmove 是否比模运算更快?

我正在写一个数字滤波器,我需要保留最后的 X 值并将它们加在一起。 现在有两种可能的方法。要么我使用 memmove 移动整个数组来制作 ro ...

回答 5 投票 0

面对 rte_pktmbuf_clone 的问题

基本上我使用 DPDK 库(dpdk-stable-19.11.10)通过路由器向 DNS 响应者发送 DNS 查询消息, 当我发送数据包时,我正在使用 wireshark 捕获数据包并且数据包看起来

回答 0 投票 0

C:将结构成员从一个结构复制到另一个类似但不同的结构中。

我有以下两个结构: typedef struct { double num1; double num2; /double num3, num4, num5, num6; /去掉未使用的变量以减小数据大小 double num7; ...

回答 1 投票 0

在memcpy中对齐源地址和目的地址。

我想写一个memcpy代码,它是一个字一个字的复制,而不是一个字节一个字节的复制,以提高速度。(虽然我需要为最后一个或几个字节做一些逐字拷贝)。所以我想把我的源文件和....

回答 2 投票 4

memcpy()是否使用了realloc()?

#inlcude #inlcude #inlcude int main() { char *buff = (char*)malloc(sizeof(char) * 5); char *str = "abcdefghijklmnopqrstuvwxyz"; memcpy (...

回答 4 投票 5

在c++中通过memcpy将int数组转换为char数组并返回。

我想把一个int数组转换为char数组,然后再转换回来,以达到序列化的目的。它不需要跨平台工作。我想到了/sample int数组 int arr[] = {...。

回答 2 投票 3

在C语言中连接两个整数数组。

我正在尝试连接两个整数组,这个方法对于字符串(char*)效果很好,但是对于整数组来说,第二个数组的内容会被改变。这个方法对于字符串(char*)很有效,但是对于整数组来说,第二个数组的内容会被改变。 int main() { int* a = malloc(8); / 2 ...

回答 1 投票 1

memcpy CString to char*

我试图使用memcpy()将一个CString复制到一个char*中,但我很难做到。事实上,只有第一个字符被复制。下面是我的代码。CString str = _T("something"); char* buff = new ...

回答 3 投票 1

为什么我在使用memset将对象填充为0后,在dynamic_cast时出现异常?

我得到这个奇怪的运行时异常与dynamic_cast,但只有当我填写的对象,我正在铸造与零使用memset,或只是复制一些数据到它与memcpy 。下面是一个例子...

回答 2 投票 0

我想直接将memcpy放入一个结构体中,但没有一个方法能正确避免padding的问题

我试图打开一个二进制文件 并从中读取头文件 我可以用一系列的整数来读取它,但我决定将它转换成一个结构,以允许n个对象的数量。然而,我 ...

回答 1 投票 0

C - MemncpyStrncpy(也试过strncat)复制的字符比应该的少了1个,希望得到帮助。

就像我说的,memncpy()(在main的中间)比它应该复制的少了一个字符,不知道为什么。我加了注释和图片,让它更容易理解。#define BIT_AMOUNT 4 char * ...。

回答 1 投票 1

如何对一个数组进行浅层复制,并将该副本存储在一个结构中。

我有一个结构。 typedef struct Heap { int length; int size; int A[]; }。Heap; 我试图将一个给定的数组做一个浅层拷贝,并将其存储在这个结构中。这样,当数组 ...

回答 1 投票 0

如何使用memcpy将一个数组复制到另一个数组?

for (i = 0; i < n1; i++) L[i] = arr[l + i]; 因为要复制一个大数组,听说需要用到memcpy。

回答 2 投票 0

当我输入100000000时,complier show killed [关闭]

/ *如果有* /,则复制L []的其余元素,而(i #include

回答 1 投票 -1

如何更改为memcpy

/ *如果有* /,则复制L []的其余元素,而(i #include

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.