草庐IT

c++ - 使用数组和某些方法来 memcpy struct 是否安全?

我想知道在包含数组和方法的结构上使用memcpy是否安全(只是一些getter和setter,因为数组的索引是不寻常的,我必须以某种方式映射它)。我知道它对POD是安全的,但我不确定我的结构是否会被视为POD? 最佳答案 您可以使用memcpy如果struct是TriviallyCopyable.您可以检查您的struct可以通过使用std::is_trivially_copyable轻松复制.此外,正如@JohanLundberg在评论中指出的那样,目标地址必须是0模std::alignment_of.您可以在http://en.

c++ - 在 void 指针指向的内存中创建一个对象

如果我有一些空闲内存块的void*并且我知道至少有sizeof(T)可用,是否有任何方法可以在内存中的那个位置创建类型T的对象?我只是想在堆栈上创建一个T对象并将其memcpy过来,但似乎必须有更优雅的方法来做到这一点? 最佳答案 为其使用新的放置:#includevoid*space;new(space)T();记得在释放内存之前删除它:((T*)space)->~T();不要在栈上创建对象然后memcpy过来,不安全,如果对象的地址存储在成员或成员的成员中怎么办? 关于c++-在vo

c++ - memcpy() 相邻内存区域的安全性

我最近在usingvolatile上问了一个问题并被引导阅读一些非常来自Intel和其他讨论内存屏障及其用途的信息性文章。读完这些文章后,我变得相当偏执。我有一台64位机器。从多个线程memcpy到相邻的、非重叠的内存区域是否安全?例如,假设我有一个缓冲区:charbuff[10];一个线程memcpy到前5个字节而第二个线程复制到最后5个字节是否总是安全?我的直觉react(和一些简单的测试)表明这是完全安全的,但我无法在任何地方找到可以完全说服我的文档。 最佳答案 安全,是的。性能,至少在这个有限的例子中没有。请记住,一个缓存行

c++ - 使用 memcpy 时出现内存错误?

我正在使用dcmtk库修改多帧压缩dicom图像的像素数据。因此,要做到这一点,在for循环的一个阶段,我获取每个解压缩帧的像素数据并根据我的意愿修改它们,并尝试将每个修改后的像素数据连接到一个大内存缓冲区帧中框架。for循环的核心过程如下。问题是在第一次迭代之后,它在我调用函数getUncompressedFrame的代码行提供了内存。我认为这是因为memcpy(fullBuffer+(i*sizeF),newBuffer,sizeF);行而发生的,因为当我删除该行时,当时没有错误,整个for循环工作得很好.如果我在使用memcpy时犯了错误,你能告诉我吗?谢谢。Uint32size

c++ - memcpy() 函数是可重入的吗?

我在信号处理程序中调用了一些C++函数,但我的程序因段错误而终止。当我检查gdb时,memcpy()函数是我获得SIGSEGV的地方。我想知道memcpy()是否是可重入函数? 最佳答案 在除了最高度嵌入的平台之外的所有平台中,它都是可重入的。你提到SIGSEGV所以我认为它不是其中之一。在这种情况下,很可能memcpy()不是罪魁祸首:这是调用者的错。如果您要求memcpy()复制错误的指针(或错误的长度),那么它就会出错。你可以很容易地做到这一点:memcpy(NULL,NULL,123456789);这会导致SIGSEGV,它

c++ - 为什么 memcpy/memmove 在将 int 复制到字节缓冲区时反转数据?

所以,我的问题很简单:我需要用一些信息填充一个char/unsignedchar数组。中间的一些值取自short/int类型,这就是发生的情况:代码:intfoo=15;//0x0000000Funsignedcharbuffer[100]={0};..memcpy(&buffer[offset],&foo,sizeof(int));//eithermemmove...输出:...0F000000..所以现在我写了一个函数来反转这些字段,但我认为这不是一个明智的解决方案,因为它会影响执行时间、资源和开发时间。有更简单的方法吗?编辑:正如你们中的许多人所指出的,这种行为是由小端处理器产生

c++ - Memcpy、字符串和终止符

我必须编写一个函数,用字符串的内容填充指定长度的char*缓冲区。如果绳子太长,我只需要剪掉它。缓冲区不是由我分配的,而是由我的函数的用户分配的。我试过这样的事情:intwritebuff(char*buffer,intlength){stringtext="123456789012345";memcpy(buffer,text.c_str(),length);//buffer[length]='\0';return1;}intmain(){char*buffer=newchar[10];writebuff(buffer,10);cout我的问题是关于终结符:它应该存在还是不存在?这个

c++ - 我可以使用 memcpy(*this) 修改构造函数中的所有类成员吗?

structSomething{inta;intb;Something(char*buffer){memcpy(this,buffer,sizeof(Something));};};这合法吗?安全的?对我来说它看起来不错,但我不确定C++标准是否以某种方式禁止它。 最佳答案 ...fromthefactthatit'snolongeraPODtypeafterIaddedtheconstructor.这不是事实(只是假新闻;-))。添加构造函数不会更改struct的POD类型状态。您还可以使用static_assert轻松检查:st

c++ - 在什么平台上 memmove 和 memcpy 会有显着的性能差异?

我知道memmove和memcpy的区别在于memmove处理内存重叠情况。我检查了libgcc中的实现并得到了这篇文章[memcpyperformance]来自英特尔网站。在libgcc中,memmove类似于memcpy,都是一个字节一个字节地走,所以即使经过优化,性能应该也差不多。有人测过这个得到这篇文章memcopy,memmove,andSpeedoverSafety.即使我不认为memmove可以比memcpy更快,但至少在Intel平台上应该没有太大区别。那么在什么平台上以及如何,memcpy可以比memmove快得多,如果没有,为什么要提供两个类似的函数而不是仅仅mem

c++ - 我可以使用 memcpy 写入多个相邻的标准布局子对象吗?

免责声明:这是试图深入研究一个更大的问题,因此请不要纠结于该示例在实践中是否有意义。而且,是的,如果您想复制对象,请使用/提供复制构造函数。(但请注意,即使是示例也不会复制整个对象;它会尝试在几个相邻的(Q.2)整数上blit一些内存。)给定一个C++StandardLayoutstruct,我可以使用memcpy一次写入多个(相邻的)子对象?完整示例:(https://ideone.com/1lP2Gdhttps://ideone.com/YXspBk)#include#include#include#include#include#includestructMyStandardLa