所以我发现了这个:
std::fill_n(array, 100, value);
但我怀疑它可能不是我想要的。我有一个appay *指针,需要快速在几个连续元素中放入相同的值,因为它们是像素,并且有很多。
所以我用:
*(pointer)=*(pointer+1)=value;
有时会有 (指针)= (指针+ 1)= *(指针+ 2)=值; 但第一种情况最为重要。我知道,另外一个“+”不是问题,但是当我使用SDL的功能来填充黑屏(或其他)时,它的工作速度很快,我不知道它是如何优化的。
因此,如果我需要在数组的少数邻居元素中逐步输入相同的值,那么有一些很酷的技巧。
也许有些人转向(Uint64)和<< 32将2个相同的值放在2个整数技巧中?
对不起,我从一开始就没有解释这是什么意思。 所以我渲染体素对象,有时在旋转后,对象内部的屏幕上有斑点,没有像素被淹没,因为我只有一些外层物体。我希望通过基本上将对象向右拉伸一个像素来进行平滑处理。因此,当我放置像素时,我需要将一个像他一样放在右边。答案 0 :(得分:1)
如果你想填充100个(甚至1000个)unsigned int
个元素,那么你可以选择你想要的任何方法,无论是std::fill_n
还是for
循环 - 数字是这样的小的你不会看到差异,即使你经常这样做。
但是,如果你想为更大的数组设置值,比如8k x 8k纹理,像素由4个无符号颜色分量组成,那么你可以使用的方法进行简短比较:
#include <iostream>
#include <ctime>
#include <cstdint>
int main(){
long unsigned const size = 8192 * 8192 * 4;
unsigned* arr = new unsigned[size];
clock_t t1 = clock();
memset(arr, 0, size*sizeof(unsigned));
clock_t t2 = clock();
std::fill_n(arr, size, 123);
clock_t t3 = clock();
for(int i = 0; i < size; ++i)
*(arr + i) = 123;
clock_t t4 = clock();
int64_t val = 123;
val = val << 32 | 132;
for(int i = 0; i < size / 2; ++i)
*(int64_t*)(arr + i * 2) = val;
clock_t t5 = clock();
std::cout << "memset = " << t2 - t1 << std::endl;
std::cout << "std::fill_n = " << t3 - t2 << std::endl;
std::cout << "for 32 = " << t4 - t3 << std::endl;
std::cout << "for 64 = " << t5 - t4 << std::endl;
delete arr;
return 0;
}
<强> 1。 memset
强>
此函数仅用于向您显示与其他方法相比,归零阵列的速度有多快。这是最快的解决方案,但只有在您希望将每个字节设置为相同的值时才可用(对于您的情况,0
和0xFF
特别有用,我猜)。
<强> 2。 std::fill_n
和for
循环使用32位值
std::fill_n
看起来是最慢的解决方案,它甚至比具有32位值的for
解决方案稍微慢。
第3。 for
循环,64位值为64位SYSTEM
我想这是你可以采用的解决方案,因为它赢得了这场比赛。但是,如果您的机器是32位,那么我希望结果可以与具有32位值的循环相比(取决于编译器和处理器),因为处理器将处理一个64位值作为两个32位值。
答案 1 :(得分:0)
是的,您可以使用一个64位变量将值放入两个(或更多)32位(或更小)连续元素中。有很多ifs。显然你应该使用64位patform,你应该知道你的平台如何处理对齐。
某些人喜欢这样:uint32_t val = ...;
uint64_t val2 = val;
(val2 <<= 32) |= val;
for (uint32_t* p = ...; ...)
*(uint64_t*) p = val2;
如果使用SSE,可以使用类似的技术,效果更好。