0

所以我发现了这个:

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

但我怀疑它可能不是我想要的。我有一个 appay *pointer,需要快速将相同的值放入几个顺序元素中,因为它们是像素,而且有很多。

所以我使用:

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

有时有 (pointer)= (pointer+1)=*(pointer+2)=value; 但第一种情况是最关键的。我知道,一个额外的“+”不是问题,但是当我使用 SDL 的功能来填充屏幕黑色(或其他)时,它的工作速度有点快,我不知道它是如何优化的。

因此,如果我需要在数组的几个相邻元素中输入相同的值,是否有一些很酷的技巧。

也许一些转换为 (Uint64) 和 <<32 将 2 个相同的值放在 2 个整数中?

好吧,对不起,我没有从一开始就解释这是为了什么。所以我渲染体素对象,有时在旋转后,对象内部的屏幕上会出现斑点,没有像素被淹没,因为我只淹没了对象的外层。我想通过基本上将对象向右拉伸一个像素来进行平滑处理。所以当我放像素的时候,我需要把一个像他一样的放在他的右边。

4

2 回答 2

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 位值循环

我想这是您可以寻求的解决方案,因为它赢得了这场比赛。但是,如果您的机器是 32 位的,那么我希望结果与具有 32 位值的循环相当(取决于编译器和处理器),因为处理器会将一个 64 位值作为两个 32 位处理价值观。

于 2013-07-27T08:19:29.950 回答
0

是的,您可以使用一个 64 位变量将一个值放入两个(或更多)32 位(或更小)连续元素中。有很多如果。显然,您应该使用 64 位平台,并且您应该知道您的平台如何处理对齐。

像这样的东西:

uint32_t  val = ...;
uint64_t  val2 = val;
(val2  <<= 32) |= val;

for (uint32_t* p = ...; ...)
     *(uint64_t*) p = val2;

如果您使用 SSE,您可以使用效果更好的类似技术。

于 2013-07-27T07:20:49.700 回答