strict-aliasing

    8熱度

    3回答

    我的程序符合嚴格的別名規則,除了一個地方:一個包含散列函數(如MurmurHash3,SpookyHash等)的編譯單元。在x86和x86_64上,這些散列函數接受const char *,將它們轉換爲uint32,數據以4字節爲單位。這使得它們比逐字節地處理數據要快得多,但我相信這打破了嚴格的別名規則。現在,我用-fno-strict-aliasing編譯這個編譯單元,而我用-fstrict-a

    4熱度

    1回答

    下面的代碼單產G ++警告: #include <iostream> #include <cstdint> template <typename T, typename P, typename Q> Q T::*pointer_to(P T::*p, Q P::*q) { typedef Q T::* output_ptr; // warning: dereferencing

    1熱度

    3回答

    struct test { char member1; char member2; }; int main(void) { struct test structure[] = {'h', 'i'}; static void* p = &structure; printf("%i", *((int*)p)); return 0

    5熱度

    1回答

    我使用std::aligned_storage作爲變體模板的後備存儲。問題是,一旦我在gcc上啓用了-O2,我開始收到警告'dereferencing type-punned pointer will break strict aliasing`。 真正的模板要複雜得多(類型在運行時檢查),但一個小例子,生成警告: struct foo { std::aligned_storage<1

    0熱度

    1回答

    我寫了一個類來存儲一個函數指針或一個成員函數指針(不是每次都是)。當我存儲成員函數指針時,我也存儲一個對象指針(接收者)。 問題是:我不提前知道對象的類型和函數簽名,所以我使用模板類型名。對於我使用可變參數模板的參數。 我有一個類似的代碼: template <typename... Args> class A { public: template <typename Object

    18熱度

    4回答

    我試圖檢查我的一些代碼是否存在嚴格的別名違規行爲,但它似乎在嘗試理解嚴格別名 規則時錯過了某些內容。 想象以下代碼: #include <stdio.h> int main(void) { unsigned long l; l = 0; *((unsigned short *)&l) = 1; printf("%lu\n", l);

    2熱度

    1回答

    我有一個使用std::complex<double>類型的代碼。 從FFTW Manual: ,如果你有一個變量 complex<double> *x ,你可以直接通過它通過reinterpret_cast<fftw_complex*>(x)到FFTW。 然而,當我這樣做在我的代碼: tmp_spectrum = reinterpret_cast<std::complex<double>*>(ff

    3熱度

    2回答

    我讀過了關於restrict關鍵字的許多帖子。但實際上,我可以找到的每個示例似乎都只將輸入參數引用到函數中,也許只是一個值。我需要澄清我的理解。 我發現一個函數看起來像是完全違反了輸入參數和局部變量的關鍵字規則。 該函數用void *調用到緩衝區,指針聲明爲_restrict(這是Microsoft Visual C++)。在函數的後面,聲明一個類型爲UCHAR *的本地變量指針,並使其指向同一個

    2熱度

    1回答

    我有以下結構: typedef struct{ int data[LENGTH]; }Data; ,並使用它,像這樣: Data* dt=CALLOC(...) int foo(Data* restrict d){ for(...) d[i]->data[j]; //do stuff with data[] } 我的問題是:是否從d去除嚴格

    2熱度

    2回答

    我在一些遺留的源代碼的行: #define MAXMSG 1024 ... char m_recvBuf[MAXMSG]; unsigned int msgLength = ntohl(*((unsigned int *)m_recvBuf)); 這產生以下警告: x.cpp: In member function ‘bool xx::cccc(std::string&)’: x.cp