Предотвращение незначительных сбоев страниц в программе на C ++ с g ++ - PullRequest
1 голос
/ 30 октября 2011

Я пытаюсь разгадать эту загадку: Пазл с кодировкой доставки . Это код, который я дошел до сих пор:

#include <fcntl.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <sstream>
#include <set>
using namespace std;
struct Container
{
    Container(int c, int w) : cost(c), weight(w){}
    int cost;
    int weight;
    bool operator<(const Container& c) const
    {
        return double(cost)/weight < double(c.cost)/c.weight;
    }
};
int main(int argc, char** argv)
{
    int fd = open(argv[1], O_RDONLY);
    char* pContent = (char*)mmap(NULL, 128 * sizeof(int), PROT_READ, MAP_PRIVATE, fd, 0);
    pContent += 8;
    stringstream ss(pContent);
    int unload = 0;
    ss >> unload;
    set<Container> containers;
    int cost = 0, weight = 0;
    while(ss >> cost)
    {
        ss >> weight;
        containers.insert(Container(cost, weight));
    }

    const Container& best = *containers.begin();
    cost = best.cost * ceil(double(unload)/best.weight);
    printf("%d\n", cost);
    return 0;
}

Я знаю, что в этой логике могут быть ошибки. Но мой вопрос не связан с логикой. Когда я отправляю этот код, он успешно запускается, но результат, который я получаю, меньше, поскольку он говорит, что количество мелких ошибок на странице равно 409. Когда я вижу список лидеров, кто-то представил код C ++ с незначительными ошибками страницы 69. Есть ли способ, которым я могу контролировать эти незначительные ошибки страницы? Может быть, использовать некоторые флаги G ++? Прямо сейчас мой make-файл очень прост: g++ -o MyExe MyExe.cc.

1 Ответ

2 голосов
/ 30 октября 2011

Вы зависите от любого алгоритма и среды выполнения, которые Gild использует для оценки. Я думаю, что флаги компилятора, вероятно, красная сельдь; Я подозреваю, что отправка в "режиме выпуска" включает -O2 или -O3 для вас.

Я подозреваю, что это вопрос оптимизации использования памяти, возможно, локальности памяти. Например, этот поток строк и набор могут стать очень дорогими; на вашем месте я бы начал искать, есть ли другой путь, возможно, с более специализированным алгоритмом.

...