繁体   English   中英

在几个顺序数组元素中输入相同的值

[英]Input same value in few sequential array elements

所以我发现了这个:

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

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

所以我用:

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

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

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

也许有人强制转换为(Uint64)和<< 32以将2个相同的值放置在2个整数中的把戏?

Okey,对不起,我从一开始就没有解释这是什么意思。 因此,我渲染体素对象,有时在旋转后,对象内部的屏幕上会出现斑点,没有像素被淹没,因为我只拖延了对象的某种外层。 我想通过基本将对象向右拉伸一个像素来进行平滑。 因此,在放置像素时,我需要像他一样放置一个像素。

如果要填充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_n和带有32位值的for循环

std::fill_n看起来是最慢的解决方案,甚至比32位值的for解决方案还要

3. for循环使用64位系统上的64位值

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

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

像这样的东西:

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

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

如果使用SSE,则可以使用相似的技术产生更大的效果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM