Что такое uintptr_t тип данных

Этот вопрос слишком широкий. Да, вы можете использовать DeferredResult , чтобы завершить веб-запрос позже. Но doAnotherSomething() на самом деле должен делать вещи асинхронно, в противном случае вы все равно будете использовать поток, а не поток из пула сервера приложений. Что было бы пустой тратой, поскольку вы можете просто увеличить размер пула сервера приложений и покончить с этим. «Разгрузка» работы из нее в другой пул - погоня за диким гусем.

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

Вот пример того, как использовать асинхронный драйвер mongodb :

@GetMapping("/foo")
public DeferredResult> foo() {
    DeferredResult> res = new DeferredResult<>();
    doSomething();
    doAnotherSomething(res);
    return res;
}

void doAnotherSomething(DeferredResult> res) {
    collection.find().first(new SingleResultCallback() {
        public void onResult(final Document document, final Throwable t) {
            // process (document)
            res.setResult(ResponseEntity.ok("OK")); // finish the request
        }
    });
}

233
задан leiyc 6 August 2019 в 23:25
поделиться

4 ответа

uintptr_t - это целочисленный тип без знака, который может хранить указатель данных. Обычно это означает, что он того же размера, что и указатель.

Он необязательно определен в стандартах C ++ 11 и более поздних.

Распространенной причиной, по которой требуется целочисленный тип, который может содержать тип указателя архитектуры, является выполнение целочисленного -специфические операции с указателем, или скрыть тип указателя, предоставив его как целочисленный «дескриптор».

Изменить: Обратите внимание, что у Стива Джессопа есть некоторые очень интересные дополнительные детали (которые я не украду) в другом ответе здесь для педантичных типов :)

181
ответ дан 23 November 2019 в 03:32
поделиться

Рискуя получать другой значок Некроманта, я хотел бы добавить одно очень хорошее использование для uintptr_t (или даже intptr_t), и это пишет тестируемый встроенный код. Я пишу главным образом встроенный код, предназначенный для различной руки и в настоящее время tensilica процессоры. Они имеют различную собственную ширину шины, и tensilica является на самом деле Гарвардская архитектура с отдельным кодом и шинами данных, которые могут быть различными ширинами. Я использую стиль разработки через тестирование для большой части моего кода, что означает, что я делаю модульные тесты на все элементы кода, которые я пишу. Поблочное тестирование на фактических целевых аппаратных средствах является стычкой, таким образом, я обычно пишу все на основанном на Intel ПК или в использовании Windows или Linux Ceedling и GCC. Однако много встроенного кода включает манипуляции адресом и битовое жонглирование. Большинство моих машин Intel составляет 64 бита. Таким образом, если Вы собираетесь протестировать управление адресом, кодируют Вас, нуждаются в обобщенном объекте сделать математику на. Таким образом uintptr_t дают Вам независимый от машины способ отладить Ваш код, прежде чем Вы попытаетесь развернуться для предназначения для аппаратных средств. Другая проблема для некоторых машин или даже моделей памяти на некоторых компиляторах, указатели функции и указатели данных являются различными ширинами. На тех машинах компилятор даже не может позволить бросать между этими двумя классами, но uintptr_t должен быть в состоянии содержать также.

0
ответ дан 23 November 2019 в 03:32
поделиться

Во-первых, в то время, когда был задан вопрос, uintptr_t не был на C ++. Он находится в C99, в , как необязательный тип. Многие компиляторы C ++ 03 предоставляют этот файл. Он также находится в C ++ 11, в , где он снова является необязательным и в определении ссылается на C99.

В C99 он определяется как «целочисленный тип без знака с свойство, что любой действительный указатель на void может быть преобразован в этот тип, затем преобразован обратно в указатель на void, и результат будет сравниваться с исходным указателем ".

Воспринимайте это, чтобы означать то, что он говорит. Он ничего не говорит о размере.

uintptr_t может иметь тот же размер, что и void * . Может быть, больше. Возможно, это могло быть меньше, хотя такая реализация на C ++ кажется извращенной. Например, на некоторой гипотетической платформе, где void * составляет 32 бита, но используются только 24 бита виртуального адресного пространства, вы можете иметь 24-битный uintptr_t , который удовлетворяет требованиям. Я не знаю, почему реализация может это делать, но стандарт это разрешает.

225
ответ дан 23 November 2019 в 03:32
поделиться

Это целочисленный тип без знака, размер которого равен размеру указателя. Всякий раз, когда вам нужно сделать что-то необычное с указателем - например, инвертировать все биты (не

19
ответ дан 23 November 2019 в 03:32
поделиться
Другие вопросы по тегам:

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