小编Nia*_*all的帖子

如果我为一个类编写运算符new和delete,我是否必须编写所有重载?

C++ Reference页面列出了全局新运算符的 8个特定类的重载.其中四个是为2017版C++添加的.

特定于类的分配函数

void* T::operator new  ( std::size_t count );   
void* T::operator new[]( std::size_t count );
void* T::operator new  ( std::size_t count, std::align_val_t al ); // (since C++17)
void* T::operator new[]( std::size_t count, std::align_val_t al ); // (since C++17)
Run Code Online (Sandbox Code Playgroud)

特定于类的放置分配功能

void* T::operator new  ( std::size_t count, user-defined-args... );
void* T::operator new[]( std::size_t count, user-defined-args... );
void* T::operator new  ( std::size_t count,
    std::align_val_t al, user-defined-args... ); // (since C++17)
void* T::operator new[]( std::size_t count,
     std::align_val_t …
Run Code Online (Sandbox Code Playgroud)

c++ memory-management new-operator delete-operator

9
推荐指数
1
解决办法
698
查看次数

C++关闭hack

这样的闭包实现有什么问题(从python hack中被盗)?

void function(int value) {
    struct closure {
        closure(int v = value) : value_(value) {}
        private: int value_;
    };
    closure c;
}
Run Code Online (Sandbox Code Playgroud)

经过进一步调查,它出现在成员函数中,局部变量不能用作默认值,但是对象变量可以.

c++ closures

8
推荐指数
2
解决办法
2701
查看次数

有没有办法在使用clang的VisitCallExpr方法中获取CallExpr*的调用者?

该方法getDirectCallee()可以获取调用表达式的被调用者(称为方法/函数),但有没有办法获取CallExpr*in VisitCallExpr()方法的调用者(调用它的方法/函数)?

有没有其他方法可以知道一个调用表达式的调用者?

c++ recursion clang abstract-syntax-tree

8
推荐指数
2
解决办法
1936
查看次数

Windows和Linux上的C++ [[gnu :: visibility("default")]] vs __declspec(dllexport)

我需要在C++中创建一些共享库,并使用linux作为我的开发人员操作系统.我知道如果我想通过dlsym/ 加载它们,我需要使符号可见LoadLibrary.所以在linux中我的所有符号都遵循这种模式:

extern "C" [[gnu::visibility("default")]] void f();
Run Code Online (Sandbox Code Playgroud)

我使用了启用了C++ 11的clang,我能够加载f我的宿主程序.当我移动到Windows时,我使用GCC 4.8.2启用了C++ 11,并且该模式也适用于Windows机器LoadLibrary.(我需要使用C++ 11来获取新的属性语法).我知道在Windows上我需要用来__declspec(dllexport)从共享库中导出符号.所以现在怎么办?是__declspec(dllexport)不是不再需要?

编辑:

我发现在这里,那些是同义词(我认为),所以问题是,是否有一个[[gnu::attribute]]用于__declspec(dllimport)避免使用宏和ifdefS代表具体的目标?

c++ attributes visibility declspec

8
推荐指数
1
解决办法
2434
查看次数

右值对函数的引用

typedef void(&&RF)(void* p);

RF rf()
{
    return f;
}

int ay[10] = { 0 };

typedef int(&&RA)[10];

RA ra()
{
    return ay; // error
}

cout << is_lvalue_reference<decltype(rf())>::value << endl; // 1
Run Code Online (Sandbox Code Playgroud)

C++参考文献说"对函数的rvalue引用被视为左值,无论是否命名".

但我无法理解这是什么考虑因素?我想也许函数的名称总是左值.所以它必须保持左值的属性,并确保将函数名称传递给可以调用的任何地方,比如rf()(NULL).然后数组名称在我脑海中被禁止.我认为它也总是一个左值,所以我编写了上面的代码来测试它并得到一个错误.

谁能指出所有这一切背后的真正原因?

c++ rvalue-reference c++11

8
推荐指数
1
解决办法
831
查看次数

用户定义的文字的范围是什么?

考虑这两个:

namespace X1
{
    A operator "" _x(unsigned long long i) { return A{i}; }
};

namespace X2
{
    B operator "" _x(unsigned long long i) { return B{i}; }
};
Run Code Online (Sandbox Code Playgroud)

x文本被定义了两次,但其中一人在规定namespace X1而另一个定义namespace X2.

根据C++标准,可以编译这段代码吗?

c++ user-defined-literals c++11

8
推荐指数
1
解决办法
330
查看次数

如何理解C++中的std :: distance

代码如下:

int B[] = {3,5};
int C[] = {4,5};
cout << distance(B,C);
Run Code Online (Sandbox Code Playgroud)

输出是:

-4

谁能解释为什么会这样?

c++

8
推荐指数
2
解决办法
7508
查看次数

是否可以列出由于潜在的锯齿违规而导致的负载?

我一直在研究一个相当大的性能关键代码库,用最新版本的gcc进行编译会给出关于类型惩罚的大量警告,这使我可以编译-fno-strict-aliasing.我不相信这里有任何性能损失,无论如何都可以避免.但我确实认为,相同类型的别名指针可能存在更为重要的问题.

有没有办法让gcc或任何其他工具列出代码库中的所有位置,其中由于gcc无法检测到的潜在锯齿违规,指针是否属于同一类型而发生了额外的加载/存储?这样,我可以与代码分析器进行比较,看看是否可以通过使用restrict,局部变量,重构等来改善实际情况的地方.试着通过查看生成的汇编程序来猜测编译器的想法是既费时又容易出错,特别是对此.如果它们不同,我对C和C++的答案感兴趣.

c c++ optimization gcc

8
推荐指数
1
解决办法
158
查看次数

如何禁止建造物体?

如何禁止构造物体?我将= delete;所有相关的特殊功能标记如下:

struct A
{
    A() = delete;
    A(A const &) = delete;
    A(A &&) = delete;
    void * operator new(std::size_t) = delete;
    void operator delete(void *) = delete;
};
A x{};
A y = {};
A * z = ::new A{};
Run Code Online (Sandbox Code Playgroud)

LIVE EXAMPLE

但是x,y*z仍然可以存在.该怎么办?我对这两种情况都感兴趣; 静态/堆栈分配和堆分配.

c++ memory-management memory-layout c++11 c++14

8
推荐指数
3
解决办法
334
查看次数

nullptr和指针算术

考虑以下代码,是否可以安全地进行指针运算nullptr

我假设nullptr在另一个结果中添加任何偏移nullptr,到目前为止MSVC产生的结果与我预期的一样,但是我有点不确定这样使用是否nullptr安全:

float * x = nullptr;

float * y = x + 31; // I assume y is a nullptr after this assigment

if (y != nullptr)
{
  /* do something */
}
Run Code Online (Sandbox Code Playgroud)

c++ pointers nullptr c++11

8
推荐指数
2
解决办法
1125
查看次数