Czy kompilator może to zoptymalizować (zgodnie ze standardem C ++ 17): int fn() { volatile int x = 0; return x; } do tego? int fn() { return 0; } Jeśli tak, dlaczego? Jeśli nie, dlaczego nie? Oto kilka przemyśleń na ten temat: obecne kompilatory kompilują się fn()jako zmienna lokalna …
Czy mogę używać NULLwskaźnika jako zamiennika wartości 0? Czy jest w tym coś złego? Jak na przykład: int i = NULL; jako zamiennik dla: int i = 0; W ramach eksperymentu skompilowałem następujący kod: #include <stdio.h> int main(void) { int i = NULL; printf("%d",i); return 0; } Wynik: 0 Rzeczywiście …
Patrząc na ten kod: static int global_var = 0; int update_three(int val) { global_var = val; return 3; } int main() { int arr[5]; arr[global_var] = update_three(2); } Który wpis tablicy zostanie zaktualizowany? 0 czy 2? Czy w specyfikacji C jest część wskazująca na pierwszeństwo działania w tym konkretnym przypadku?
Rozważ następujący fragment kodu: #include <array> int main() { using huge_type = std::array<char, 20*1024*1024>; huge_type t; } Oczywiście ulegnie awarii na większości platform, ponieważ domyślny rozmiar stosu jest zwykle mniejszy niż 20 MB. Teraz rozważ następujący kod: #include <array> #include <vector> int main() { using huge_type = std::array<char, 20*1024*1024>; std::vector<huge_type> …
Mam następujący kod: namespace A { struct Foo { int a; }; } struct Foo { int b; }; struct Bar : public A::Foo { Bar(Foo foo) { c = foo.b; } int c; }; Kompilatory C ++ narzekają na „c = foo.b”, ponieważ A :: Foo nie ma członka …
Temat był wcześniej omawiany , ale to nie jest duplikat. Kiedy ktoś pyta o różnicę między decltype(a)i decltype((a)), jak zwykle odpowiedź brzmi - ajest to zmienna, (a)jest wyrazem. Uważam tę odpowiedź za niezadowalającą. Po pierwsze, ajest to także wyrażenie. Opcje wyrażenia podstawowego obejmują między innymi: ( wyrażenie ) wyrażenie id …
W tej odpowiedzi , Zwol wykonane tego twierdzenia: Prawidłowym sposobem konwersji dwóch bajtów danych ze źródła zewnętrznego na 16-bitową liczbę całkowitą ze znakiem jest użycie funkcji pomocniczych takich jak to: #include <stdint.h> int16_t be16_to_cpu_signed(const uint8_t data[static 2]) { uint32_t val = (((uint32_t)data[0]) << 8) | (((uint32_t)data[1]) << 0); return ((int32_t) …
Przeglądając gramatykę BNF języka C, pomyślałem, że to dziwne, że reguła produkcyjna deklaracji wygląda tak (zgodnie z https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of% 20C% 20in% 20 Backus-Naur% 20form.htm ): <declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ; Po co używać *kwantyfikatora (co oznacza zero lub więcej wystąpień) dla init-declarator? Dzięki temu instrukcje takie jak int;lub void;mogą być poprawne …
Odtąd używamy N4140 (C ++ 14 Standard). Zgodnie z § 17.6.3.4 Wymagania mieszania , Zwrócona wartość zależy tylko od argumentu k dotyczącego czasu trwania programu . [Uwaga: Tak więc wszystkie oceny wyrażenia h(k)o tej samej wartości kdają ten sam wynik dla danego wykonania programu . - uwaga końcowa] i § …
Ten kod nie kompiluje się w Clang (6,7,8,9, trunk), ale dobrze się kompiluje w GCC (7.1, 8.1, 9.1): template<class T> struct TypeHolder { using type = T; }; template<int i> class Outer { private: template<class T> static constexpr auto compute_type() { if constexpr (i == 42) { return TypeHolder<bool>{}; } …
Rozważ następujący kod . struct any { template <typename T> operator T &&() const; template <typename T> operator T &() const; }; int main() { int a = any{}; } Tutaj drugi operator konwersji jest wybierany przez rozdzielczość przeciążenia. Dlaczego? O ile rozumiem, dwa operatory są wydedukowane odpowiednio operator int …
Rozważ następującą strukturę: struct s { int a, b; }; Zazwyczaj 1 , ta struktura będzie miała rozmiar 8 i wyrównanie 4. Co jeśli utworzymy dwa struct sobiekty (a ściślej zapisujemy do przydzielonej pamięci dwa takie obiekty), przy czym drugi obiekt nakłada się na pierwszy? char *storage = malloc(3 * …
Rozważ ten prosty kod: void g(); void foo() { volatile bool x = false; if (x) g(); } https://godbolt.org/z/I2kBY7 Widać, że ani gccnie clangoptymalizuje potencjalnego połączenia z g. W moim rozumieniu jest to poprawne: maszyna abstrakcyjna ma zakładać, że volatilezmienne mogą się zmieniać w dowolnym momencie (z powodu np. Mapowania …
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.