我总是不确定,在C++中,restrict关键字是什么意思?
是否意味着赋予函数的两个或更多指针不重叠?还有什么意思?
我正在浏览一些文档和问题/答案,并看到它提到.我读了一个简短的描述,声明它基本上是程序员的承诺,指针不会用于指向其他地方.
任何人都可以提供一些现实案例,其值得实际使用吗?
我复制从N个字节pSrc来pDest.这可以在一个循环中完成:
for (int i = 0; i < N; i++)
*pDest++ = *pSrc++
Run Code Online (Sandbox Code Playgroud)
为什么这比memcpy或慢memmove?他们用什么技巧加快速度?
我有一个foo(int[] nums)我理解的功能基本上相当于foo(int* nums).在里面foo我需要将指向的数组的内容复制nums到一些int[10]声明的范围内foo.我理解以下内容无效:
void foo (int[] nums)
{
myGlobalArray = *nums
}
Run Code Online (Sandbox Code Playgroud)
复制数组的正确方法是什么?我应该像这样使用memcpy:
void foo (int[] nums)
{
memcpy(&myGlobalArray, nums, 10);
}
Run Code Online (Sandbox Code Playgroud)
或者我应该使用for循环?
void foo(int[] nums)
{
for(int i =0; i < 10; i++)
{
myGlobalArray[i] = nums[i];
}
}
Run Code Online (Sandbox Code Playgroud)
我缺少第三种选择吗?
说我有一个类,如下所示;
class MyClass
{
public:
MyClass();
int a,b,c;
double x,y,z;
};
#define PageSize 1000000
MyClass Array1[PageSize],Array2[PageSize];
Run Code Online (Sandbox Code Playgroud)
如果我的类没有指针或虚拟方法,使用以下是否安全?
memcpy(Array1,Array2,PageSize*sizeof(MyClass));
Run Code Online (Sandbox Code Playgroud)
我问的原因是,我正在处理非常大的分页数据集合,如此处所述,性能至关重要,而memcpy与迭代分配相比具有显着的性能优势.我怀疑它应该没问题,因为'this'指针是一个隐含的参数而不是存储的任何东西,但是我还应该注意其他任何隐藏的恶意吗?
编辑:
根据sharptooths评论,数据不包括任何句柄或类似的参考信息.
根据Paul R的评论,我已经分析了代码,在这种情况下避免复制构造函数的速度提高了4.5倍.这里的部分原因是我的模板化数组类比给定的简单示例稍微复杂一些,并且在为不允许浅复制的类型分配内存时调用了一个放置'new'.这实际上意味着调用默认构造函数以及复制构造函数.
第二次编辑
或许值得指出的是,我完全接受以这种方式使用memcpy是不好的做法,在一般情况下应该避免使用.它正在使用的特定情况是高性能模板化数组类的一部分,它包含一个参数'AllowShallowCopying',它将调用memcpy而不是复制构造函数.这对于诸如删除数组开头附近的元素以及将数据分入和分出二级存储之类的操作具有很大的性能影响.更好的理论解决方案是将类转换为一个简单的结构,但是考虑到这需要对大型代码库进行大量重构,避免它不是我想做的事情.
在游戏编程效率的名义下,一些程序员不信任几个C++特性.我的一位朋友声称了解游戏行业的运作方式,并会提出以下意见:
这些陈述中有多少是真的?设计C++功能时要牢记效率.这种效率不足以进行游戏编程吗?97%的游戏编程?
C-way-of-thinking仍然似乎对游戏开发社区有很好的把握.这是真的?
我在GDC 2009上观看了关于多核编程的另一个视频.他的演讲几乎完全针对单元编程,在处理之前需要进行DMA传输(简单的指针访问不适用于Cell的SPE).他不鼓励使用多态,因为指针必须"重新基于"DMA传输.多么悲伤.这就像回到广场一样.我不知道是否有一个优雅的解决方案来编程Cell上的C++多态.DMA传输的主题是深奥的,我在这里没有太多背景.
我同意C++对于那些希望使用小语言进行破解而不是阅读书籍堆栈的程序员来说也不是很好.模板也吓坏了调试.你是否同意游戏社区过分担心C++?
我对编写一个memcpy()教育练习感兴趣.我不会写一篇关于我做了什么和没想过的论文,但这里
有一些人的实现:
__forceinline // Since Size is usually known,
// most useless code will be optimized out
// if the function is inlined.
void* myMemcpy(char* Dst, const char* Src, size_t Size)
{
void* start = Dst;
for ( ; Size >= sizeof(__m256i); Size -= sizeof(__m256i) )
{
__m256i ymm = _mm256_loadu_si256(((const __m256i* &)Src)++);
_mm256_storeu_si256(((__m256i* &)Dst)++, ymm);
}
#define CPY_1B *((uint8_t * &)Dst)++ = *((const uint8_t * &)Src)++
#define CPY_2B *((uint16_t* &)Dst)++ = *((const uint16_t* &)Src)++
#define CPY_4B …Run Code Online (Sandbox Code Playgroud) 使用memcpy()源和目标重叠时可能会导致未定义的行为 - 在这些情况下只能memmove()使用.
但是,如果我确定缓冲区不重叠怎么办?是否有理由专门memcpy()或具体使用memmove()?我应该使用哪个以及为什么?
我试图通过SSE和AVX提高复制操作的性能:
#include <immintrin.h>
const int sz = 1024;
float *mas = (float *)_mm_malloc(sz*sizeof(float), 16);
float *tar = (float *)_mm_malloc(sz*sizeof(float), 16);
float a=0;
std::generate(mas, mas+sz, [&](){return ++a;});
const int nn = 1000;//Number of iteration in tester loops
std::chrono::time_point<std::chrono::system_clock> start1, end1, start2, end2, start3, end3;
//std::copy testing
start1 = std::chrono::system_clock::now();
for(int i=0; i<nn; ++i)
std::copy(mas, mas+sz, tar);
end1 = std::chrono::system_clock::now();
float elapsed1 = std::chrono::duration_cast<std::chrono::microseconds>(end1-start1).count();
//SSE-copy testing
start2 = std::chrono::system_clock::now();
for(int i=0; i<nn; ++i)
{
auto _mas = mas;
auto _tar = tar; …Run Code Online (Sandbox Code Playgroud) 我试图将C数组分配给C++ std :: array.
我怎么做,最干净的方式,没有不需要的副本等?
做的时候
int X[8];
std::array<int,8> Y = X;
Run Code Online (Sandbox Code Playgroud)
我得到一个编译错误:"没有合适的构造函数存在".