3

голосов
1

ответ
17

Просмотры

станд :: is_constructible на неполном типа

У меня есть следующий код: #include класса А; ИНТ основной () {станд :: соиЬ
R_Kapp
4

голосов
1

ответ
322

Просмотры

Неоднозначность частичная специализация в зависимости от станд :: enable_if

У меня есть следующий код: #include шаблон класса A; шаблонный класс C {общественности: ЬурейеЕ T Var_t; }; шаблонный класс В: С публичного {}; шаблон класса А {общественности: A () {станд :: соиЬ
R_Kapp
4

голосов
1

ответ
1.8k

Просмотры

Опция -ftree-векторизовать в GNU

С GCC компилятором, опция -ftree-векторизовать включается авто-векторизации, и этот флаг автоматически устанавливается при использовании -O3. До какой степени это векторизации? Т.е., я буду получать инструкции SSE2, SSE4.2, AVX или AVX2? Я знаю о существовании mavx, mavx2 флагов и т.д., но я хочу знать, что компилятор делает без этих конкретных флагов, чтобы заставить определенный тип векторизации.
R_Kapp
2

голосов
1

ответ
403

Просмотры

Наследование от STL контейнеров

Чтение StackOverflow Q &, такие как это, и это, казалось бы, унаследовав от STL контейнеров, как правило, плохая идея. Я не собираюсь делать это в рабочем коде; Однако, я хочу знать, если он даст мне правильный быстрый и грязный тест. В нашем коде, мы делаем интенсивное использование STL, и мы хотим, чтобы проверить, как выравнивание памяти границы в 64 байт будет влиять на производительность нашего кода. Я планировал, чтобы проверить это, написав простой пользовательский аллокатор и имеющей простой класс, который наследует зЬй :: вектора с единственным изменением в классе в том, что Распределитель по умолчанию моего заказа распределитель и не StD :: аллокатора, а затем просто записав сценарий использовать СЕПГ и заменить все экземпляры станд :: вектор с моим новым классом. Используя этот подход, я никогда не буду иметь никаких указателей, несущие до базового класса (все экземпляры станда :: вектор был заменен, поэтому любые указатели было бы моего пользовательского типа вместо), который, как представляется, является самой большой проблемой при наследовании от STL. Является ли это действительный подход? Есть ли другие более легкие / более безопасные альтернативы? Это базовый код 3000000 линии, поэтому вручную изменять все экземпляры станд :: вектор использовать пользовательский распределитель будет очень, очень, трудоемкая задача, мягко говоря.
R_Kapp
2

голосов
1

ответ
323

Просмотры

набран вариант `__builtin_assume_aligned` в GNU GCC?

GNU обеспечивает функцию пустоту * __builtin_assume_aligned (недействительный *, INT), который сообщает компилятор, что это безопасно предположить, что входной указатель (и вернулся с) функцией выравниваются по N байт. Тем не менее, он возвращает пустой *, а это означает, что я должен бросить возвращенный результат, т.е. плавать * Пример = (поплавок *) __builtin_assume_aligned (example_aligned, 64); или поплавок * Пример = станд :: reinterpret_cast (__builtin_assume_aligned (example_aligned, 64)); Оба они чувствуют себя, как C / C ++ - подход типа (то есть, кто-то кодирование C ++ с C кодом стиля). Есть C ++ эквивалентно __builtin_assume_aligned, или я слишком требователен?
R_Kapp
14

голосов
3

ответ
3.1k

Просмотры

Enum унаследовав от примитивного типа

Из таких вопросов, как это и это, я был под впечатлением, что наследование от примитивного типа вызовет ошибку компиляции. Тем не менее, следующий код компилируется и выдает ожидаемый выход на Ideone. #include класс перечисления Test: беззнаковый короткий ИНТ {TEST, TEST2, TEST3, test4}; ИНТ основной () {// код здесь идет тест ANS = Test :: TEST3; если (анс == Test :: TEST3) {станд :: соиЬ
R_Kapp
6

голосов
1

ответ
279

Просмотры

Может ли параметр шаблона быть как INT и неподписанный долго?

У меня есть следующий код: #include класса шаблона A {}; Шаблон класса B; шаблонный класс B {}; INT основных () {B B; возвращать 0; } Здесь Б шаблонного на междунар в то время как А шаблонных на size_t, что неподписанный долго с обоих компиляторов я использую. Когда я использую компилятор 1 (текущий составитель), все компилируется и работает так, как я ожидаю, что это. При использовании компилятора 2 (один мы переходим к), я получаю ошибку компилятора о том, что не существует специализация шаблона для B, которая принимает беззнаковое долго - он интерпретировал 3 как беззнаковое долго, как это должно быть один для A , но не может найти что-нибудь для B. исправление очевидно, - просто изменить B принять size_t, а также (или изменить, чтобы принять Int) - но мне было интересно, что строго правильным стандартом. Моя кишка ощущение, что это компилятор 2 (тот, что»
R_Kapp
2

голосов
1

ответ
394

Просмотры

Утечка памяти в GLFW

Я недавно начал смотреть в OpenGL для личных любимых проектов и пишу очень простые тестовые программы. Однако, даже с простейшей программой я могу думать об использовании GLFW, я появляюсь, чтобы получить утечку памяти: #include INT основных () {glfwInit (); glfwTerminate (); } С помощью Valgrind, я получаю сообщение: определенно потеряли: 72 байт в 1 блоках косвенно потеряли: 0 байт в 0 блоков, возможно, потеряли: 0 байт в 0 блоков еще достижимые: 122,741 байт в 446 блоков Если я закомментируйте glfwTerminate (); линии, я получаю такое же количество потерянных байт, но еще несколько байт, которые «все еще достижимы» (что делает какой-то смысл для меня - я не кончил GLFW, поэтому все, что память это выделено еще там). Оказывается, то, что утечка памяти в glfwInit (). Является ли это ошибка в GLFW, или я делаю что-то ужасно неправильно, даже в этой простой программе? (Примечание: Утечка памяти 72 байт каждый раз, когда glfwInit называется не кажется огромной сделки, я просто предпочитаю, чтобы число было 0 ...)
R_Kapp
8

голосов
3

ответ
264

Просмотры

Определяются копия Конструкторы неявно всегда, или только тогда, когда они используются?

Рассмотрим следующий код: #include #include класса А {частное: станд :: вектор _vals; }; INT основных () {А а; // A A2 (а); возвращать 0; } Компилятор компилирует это без проблем, если я не разкомментируйте из линии А а2 (а); в какой момент он жалуется на конструктор копирования для станд :: unique_ptr удаляется, и поэтому я не могу скопировать построить А. Compiler B, однако, делает эту жалобу, даже если я оставлю эту линию закомментирована. То есть, компилятор генерирует только неявно определенный конструктор копирования, когда я на самом деле пытаюсь использовать его, в то время как компилятор B делает это безоговорочно. Который правильный? Обратите внимание, что если бы я использовал зЬй :: unique_ptr _vals; вместо STD :: вектор _vals; оба компилятора правильно неявно удалить и конструктор копирования и оператор присваивания (станд :: unique_ptr имеет явно удален конструктор копирования, в то время как станд :: вектор не делает). (Примечание: Получение кода для компиляции в компиляторе B достаточно просто - явно удалить оператор конструктор копирования и присваивания, и он работает правильно, что не суть вопроса, это понять правильное поведение.).
R_Kapp
2

голосов
1

ответ
79

Просмотры

Когда указатель на переменную-член становится действительным?

Предположим, у меня есть следующие структуры класса: класс А {общественности: A (INT тест): _test (тест) {/ * ничего не делать * /} частное: INT _test; }; класс B {общественности: B (A * а): _a (а) {/ * ничего не делать * /} частное: A * _a; }; Класс C: общественный B {общественности: C (): В (& а), (5) {/ * ничего не делать * /} частное: Аа; }; Я называю конструктор B с обращением к C в переменном члене а перед тем, как инициализировать. Таким образом, любые доступы к B :: * _ будет неопределенным, пока я не инициализировать. Тем не менее, это также неопределенное поведение даже установить B :: _ а до & до инициализации? То есть, это память для C :: выделяется как только конструктор вызывается, или только тогда, когда а (5) инструкция конструктора называется?
R_Kapp
6

голосов
1

ответ
83

Просмотры

По умолчанию аргумент позволяет конструктор вызвать частный метод

У меня есть класс класса А {общественности: ключ класса {Key () {} Ключ (Key сопзЬ &) {}}; А (Клавиша, Int А = 5) {}}; Конструктор для ключа является частным, так что никто не должен быть в состоянии построить объект A. Однако, с помощью следующего кода: INT основных () {Аа (A :: Key ()); // это компилирует !!! A A2 (A :: Key (), 5); // это не // как-то недобросовестный аргумент вызывает закрытый конструктор // будет хорошо - не знаю, почему не возвращают 0; } Путем использования аргумента по умолчанию Int А в моем конструктор, компилятор компилирует счастливо мое использование A :: Key (), несмотря на то, что она является частным. Если я явно дать значение а, хотя, компилятор правильно понимает, что я пытаюсь использовать приватный конструктор и ошибки вне. Почему это? Есть ли каким-то образом, чтобы заставить компилятор без ошибок для первого примера, а? Смотрите здесь для живого примера.
R_Kapp
0

голосов
1

ответ
164

Просмотры

Тема дезинфицирующее дает ложный отрицательный для «функции расы»

Рассмотрим следующий код: #include #include #include станд :: атомное х, у; станд :: атомное r1, r2; недействительными F () {r1 = y.load (); х = r1.load (); } Аннулируются г () {г2 = x.load (); у = 42; } INT основных () {х = 0; у = 0; r1 = 0; r 2 = 0; станд :: поток t1 (е); станд :: поток t2 (г); t1.join (); t2.join (); станд :: соиЬ
R_Kapp
0

голосов
1

ответ
625

Просмотры

std::enable_if predicated on std::is_convertible not deducing template correctly

I have the following code: #include #include template void func(T a) { std::cout ::value, T>::type > void func(T) prog.cpp:5:6: note: template argument deduction/substitution failed: prog.cpp:27:8: note: couldn't deduce template parameter ‘[anonymous>’ If, however, I change the templated functions to instead be (while leaving everything else exactly the same): template void func(T a) { std::cout
R_Kapp