草庐IT

c++ - memcpy 进程安全吗?

我在网上看过,但无法找到令自己满意的答案。memcpy是线程安全的吗?(在Windows中)我的意思是,如果我使用单个memcpy写入进程之间共享的内存区域(使用boost::shared_memory_object),然后尝试从另一个内存区域读取该区域使用单个memcpy的进程然后将自动阻止一个进程当那个写发生的时候?我在哪里可以读到这方面的信息? 最佳答案 memcpy通常针对原始速度进行编码。它不会是线程安全的。如果您需要这样做,您需要在关键部分内执行memcpy调用或使用其他一些信号量机制。take_mutex(&mutex

c++ - std::copy 与 memcpy 的效率

这个问题在这里已经有了答案:Isitbettertousestd::memcpy()orstd::copy()intermstoperformance?(8个答案)关闭7年前。使用memcpy和std::copy之间的效率损失有多严重?我有一种情况,我的系统上的vector实现似乎没有使用连续内存,这让我不得不稍后std::copy它的内容而不是做memcpy(dest,&vec[0],尺寸);.我不确定这对效率的影响有多严重。

c++ - 在没有 CRT、memcpy 和 memset 内部函数的情况下构建时出现链接错误

我试图构建一个尽可能小的应用程序,在这样做的过程中,我试图通过使用WinAPI调用而不是标准C/C++调用来避免使用CRT。不幸的是,我仍然收到一个链接器错误:Error2errorLNK2001:unresolvedexternalsymbol_memcpy我没有在我的代码中的任何地方调用memcpy,所以我假设Windows函数之一正在调用它。打开内部函数会给出一个未解析的符号_memset,我也不使用它。根据我的理解,memcpy和memset都应该包含在启用的内部函数中。由于我的代码太长无法发布,以下是我程序中的WinAPI调用:lstrcpywsprintfCopyMemor

c++ - C++ 中的顺序保留 memcpy

我正在开发一个多核、多线程的软件库,我想在其中提供可能跨越多个缓存行的更新顺序保留无锁共享内存对象。具体来说,假设我有一些缓存行大小对象的vectorX:X[0],...X[K]每个都占用一个缓存行。我按索引顺序写入它们:首先是X[0],然后是X[1],等等。如果线程2读取X[K],它是否还会看到X[0]的状态“至少是当前”就像它看到的X[K]一样?从同一个线程,显然我会看到尊重更新顺序的内存语义。但是现在,如果某个第二个线程读取X[K],问题就会出现:是否会观察到X[0]...X[K-1]的相应更新?通过锁定,我们确实得到了这种保证。但是使用memcpy将某些内容复制到vector中

c++ - 来自 std::vector of objects 的 memcpy 底层数据

这是安全的还是恰好适用于我当前的编译器?标准中有关于此的内容吗?浮点vector中的结果是正确的。classColor{public:Color(floatr,floatg,floatb,floata):mColor{r,g,b,a}{};inlineconstfloat*data()const{returnmColor;}private:enum{vectorSize=4};floatmColor[vectorSize];};//teststd::vectorcolors(2);std::vectorfloats(8);colors[0]=Color(0.1,0.2,0.3,0.4)

c++ - 为什么 memcpy 在解析二进制数据时比 reinterpret_cast 慢?

TLDR:我忘记启用编译器优化。启用优化后,性能(几乎)相同。原帖从二进制数据中读取整数时,我注意到memcpy比转换解决方案慢。版本1:reinterpret_cast,由于潜在的对齐问题而有异味,但也更快(?)intget_int_v1(constchar*data){return*reinterpret_cast(data);}版本2:memcpy,正确但速度稍慢:intget_int_v2(constchar*data){intresult;memcpy(&result,data,sizeof(result));returnresult;}我有abenchmarkonIdeon

c++ - memcpy 将 ff ff ff 添加到一个字节的开头

我有一个这样的数组:unsignedchararray[]={'\xc0','\x3f','\x0e','\x54','\xe5','\x20'};unsignedchararray2[6];当我使用memcpy时:memcpy(array2,array,6);然后打印它们:printf("%x%x%x%x%x%x",array[0],//...etcprintf("%x%x%x%x%x%x",array2[0],//...etc打印如下:c03fe54e520但另一个打印ffffffc03fe54ffffffe520发生了什么事? 最佳答案

由于 memcpy,C++ ifstream::read 变慢

最近我决定优化我正在做的一些文件读取,因为正如每个人所说,将大块数据读取到缓冲区然后使用它比使用大量小读取更快。我的代码现在当然快多了,但是在进行一些分析之后,memcpy似乎占用了很多时间。我的代码的要点是...ifstreamfile("somehugefile");charbuffer[0x1000000];for(yadayada){intsize=somearbitrarysizeusuallyaroundamegabyte;file.read(buffer,size);//Dostuffwithbuffer}我正在使用VisualStudio11,在对我的代码进行性能分析后

c++ - 编写符合严格别名的 memcpy

当询问“如何实现符合严格别名规则的memcpy函数”时,一般的回答是类似void*memcpy(void*dest,constvoid*src,size_tn){for(size_ti=0;i但是,如果我理解正确的话,编译器可以自由地重新排序对memcpy的调用和对dest的访问,因为它可以重新排序对char*的写入和从任何其他指针类型的读取(严格的别名规则只能防止对char的读取重新排序*写入任何其他指针类型)。这是正确的吗?如果是,是否有任何方法可以正确实现memcpy,或者我们应该只依赖内置的memcpy?请注意,这个问题不仅涉及memcpy,还涉及任何反序列化/解码函数。

c++ - native 数组的 Memcpy 到 C++ CLI 中的托管数组

我这样做对吗?我得到一个指向native数组的指针,需要复制到托管数组。将memcpy()与pin_ptr结合使用。unsignedchar*pArray;unsignedintarrayCount;//getpArray&arrayCount(fromaCOMmethod)ManagedClass->ByteArray=gcnewarray(arrayCount)pin_ptrpinPtrArray=&ManagedClass->ByteArray[0];memcpy_s(pinPtrArray,arrayCount,pArray,arrayCount);arrayCount是pAr