UIView. То, каков максимум, ограничивает размеры, которые я могу использовать?

std::vector должен инициализировать значения в массиве так или иначе, что означает, что некоторого конструктора (или конструктор копии) нужно вызвать. Поведение vector (или любой контейнерный класс) не определено, если необходимо было получить доступ к неинициализированному разделу массива, как будто это было инициализировано.

лучший способ состоит в том, чтобы использовать reserve() и push_back(), так, чтобы конструктор копии использовался, избегая конструкции по умолчанию.

Используя Ваш пример кода:

struct YourData {
    int d1;
    int d2;
    YourData(int v1, int v2) : d1(v1), d2(v2) {}
};

std::vector<YourData> memberVector;

void GetsCalledALot(int* data1, int* data2, int count) {
    int mvSize = memberVector.size();

    // Does not initialize the extra elements
    memberVector.reserve(mvSize + count);

    // Note: consider using std::generate_n or std::copy instead of this loop.
    for (int i = 0; i < count; ++i) {
        // Copy construct using a temporary.
        memberVector.push_back(YourData(data1[i], data2[i]));
    }
}

единственная проблема с вызовом reserve() (или resize()) как это состоит в том, что можно закончить тем, что вызывали конструктора копии чаще, чем Вы должны. Если можно сделать хороший прогноз относительно заключительного размера массива, это лучше к reserve() пространство однажды вначале. Если Вы не знаете заключительного размера, хотя, по крайней мере, количество копий будет минимально в среднем.

В текущей версии C++, внутренний цикл немного неэффективен, поскольку временная ценность создается на стеке, созданном из копии к памяти векторов, и наконец временный файл уничтожается. Однако следующая версия C++ имеет функцию под названием ссылки R-значения (T&&), который поможет.

интерфейс, предоставленный [1 110], не допускает другую опцию, которая должна использовать некоторый подобный фабрике класс для построения значений кроме значения по умолчанию. Вот грубый пример того, на что этот шаблон был бы похож реализованный в C++:

template <typename T>
class my_vector_replacement {

    // ...

    template <typename F>
    my_vector::push_back_using_factory(F factory) {
        // ... check size of array, and resize if needed.

        // Copy construct using placement new,
        new(arrayData+end) T(factory())
        end += sizeof(T);
    }

    char* arrayData;
    size_t end; // Of initialized data in arrayData
};

// One of many possible implementations
struct MyFactory {
    MyFactory(int* p1, int* p2) : d1(p1), d2(p2) {}
    YourData operator()() const {
        return YourData(*d1,*d2);
    }
    int* d1;
    int* d2;
};

void GetsCalledALot(int* data1, int* data2, int count) {
    // ... Still will need the same call to a reserve() type function.

    // Note: consider using std::generate_n or std::copy instead of this loop.
    for (int i = 0; i < count; ++i) {
        // Copy construct using a factory
        memberVector.push_back_using_factory(MyFactory(data1+i, data2+i));
    }
}

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

6
задан dugla 29 September 2009 в 17:22
поделиться

3 ответа

Согласно документации UIView :

До iPhone OS 3.0 UIView экземпляры могут иметь максимальную высоту и шириной 1024 x 1024. В iPhone OS 3.0 и более поздние версии больше не ограничиваются этим максимальным размером, но по-прежнему ограничены количеством память, которую они потребляют. Следовательно, это в ваших интересах следить размеры как можно меньше. Несмотря на какая версия iPhone OS работает, вам следует подумать об использовании CATiledLayer, если вам нужно создавать представления размером более 1024 x 1024

На самом деле, мне удалось создать UIView и CALayers размером 2048 x 2048 на стандартном iPhone / iPhone 3G в версии 2.x. Все, что выше, просто перестало отображаться.

9
ответ дан 10 December 2019 в 00:41
поделиться

Я бы не подумал, что есть мыслимый предел. Поскольку размеры хранятся как числа с плавающей запятой, я предполагаю, что он ограничен CGFLOAT_MAX , который настолько велик, что о нем не нужно беспокоиться.

0
ответ дан 10 December 2019 в 00:41
поделиться

Я не знаю, есть ли конкретный предел. Я без проблем создал UIScrollViews шириной в сотни страниц. Вы пробовали это и сталкивались с проблемами?

Пол

1
ответ дан 10 December 2019 в 00:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: