"Заливка" памяти нужным значением - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Есть некий блок памяти [ ][ ][ ][ ] [ ][ ][ ][ ] [ ][ ][ ][ ]. И есть uint32_t a, равный например 0xAABBCCDD. Каким наиболее быстрым способом можно сделать так: [AA][BB][CC][DD] [AA][BB][CC][DD] [AA][BB][CC][DD]?

Решение задачи: «"Заливка" памяти нужным значением»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <memory.h>
#include <stdlib.h>
#include <time.h>
 
#define VALUE 0xAABBCCDD;
 
void usualmemfill(int size)
{
    char * start = malloc(size * sizeof(uint32_t));
    int i;
    uint32_t value = VALUE;
    for (i = 0; i < size; i++)
    {
        memcpy(start + i * sizeof(uint32_t), &value, sizeof(uint32_t));
    }
    free(start);
}
 
void newmemfill(int size)
{
    char * start = malloc(size * sizeof(uint32_t));
    uint32_t value = VALUE;
 
    asm volatile("cld\n\t"
                 "rep\n\t"
                 "stosl"
                 : /* no output registers */
                 : "c" (size), "a" (value), "D" (start)
                 /*: "%ecx", "%edi*/
                 );
 
    free(start);
    (void)value;
}
 
clock_t start;
clock_t finish;
 
#define COUNT 100000
 
int main(void)
{
    int i;
 
    printf("Starting usual\n");
    start = clock();
    for (i = 0; i < COUNT; i++)
        usualmemfill(i);
    finish = clock();
    printf("Time for usual realisation : %g\n", (float)(finish - start) / CLOCKS_PER_SEC);
    printf("Starting modified\n");
    start = clock();
    for (i = 0; i < COUNT; i++)
        newmemfill(i);
    finish = clock();
    printf("Time for modified realisation : %g\n", (float)(finish - start) / CLOCKS_PER_SEC);
    return 0;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы