在几个连续的数组元素中输入相同的值

时间:2013-07-27 07:10:56

标签: c++ arrays

所以我发现了这个:

std::fill_n(array, 100, value);

但我怀疑它可能不是我想要的。我有一个appay *指针,需要快速在几个连续元素中放入相同的值,因为它们是像素,并且有很多。

所以我用:

*(pointer)=*(pointer+1)=value;

有时会有 (指针)= (指针+ 1)= *(指针+ 2)=值; 但第一种情况最为重要。我知道,另外一个“+”不是问题,但是当我使用SDL的功能来填充黑屏(或其他)时,它的工作速度很快,我不知道它是如何优化的。

因此,如果我需要在数组的少数邻居元素中逐步输入相同的值,那么有一些很酷的技巧。

也许有些人转向(Uint64)和<< 32将2个相同的值放在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

此函数仅用于向您显示与其他方法相比,归零阵列的速度有多快。这是最快的解决方案,但只有在您希望将每个字节设置为相同的值时才可用(对于您的情况,00xFF特别有用,我猜)。

<强> 2。 std::fill_nfor循环使用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,可以使用类似的技术,效果更好。