在 cppreference 示例中具有多个参数的 new
new with multiple arguments in cppreference example
来自 cppreference's new
页。
new T; // calls operator new(sizeof(T))
// (C++17) or operator new(sizeof(T), std::align_val_t(alignof(T))))
new T[5]; // calls operator new[](sizeof(T)*5 + overhead)
// (C++17) or operator new(sizeof(T)*5+overhead, >std::align_val_t(alignof(T))))
new(2,f) T; // calls operator new(sizeof(T), 2, f)
// (C++17) or operator new(sizeof(T), std::align_val_t(alignof(T)), 2, f)
new(2, f) T;
是做什么的?
What does new(2, f) T;
do?
placement-new 中的第二个参数可用于将参数传递给您的自定义 T::operator new
实现。
这是一个触发它的玩具示例(在输出中,您可以看到参数 f=42.0
被传递给 T::operator new
):
#include <iostream>
struct T {
T() {
std::cout << "T::T called\n";
}
void* operator new(size_t s, int x, double f) {
std::cout << "T::new called with s=" << s << ", x=" << x << ", f=" << f << '\n';
return malloc(x * s);
}
char data[512];
};
int main() {
std::cout << "new T[5]:\n";
new T[5];
double f = 42.0;
std::cout << "\nnew(2, f) T:\n";
new(2, f) T;
}
输出:
new T[5]:
T::T called
T::T called
T::T called
T::T called
T::T called
new(2, f) T:
T::new called with s=512, x=2, f=42
T::T called
小心使用在线示例中的此类技巧,它们通常很糟糕。
C++ 中的 new
关键字在 C 中为 shorthand
typedef struct {
int a;
} Foo;
Foo *makeFoo(int a) {
Foo *foo = (Foo *)malloc(sizeof(Foo));
foo->a = a;
}
malloc
函数为该对象保留内存,表示它将用作指针。 new
运算符的作用相同,但默认为 sizeof(Foo)
。您看到的参数是 sizeof
和一个 align_val_t
实例的结果。
来自 cppreference's new
页。
new T; // calls operator new(sizeof(T)) // (C++17) or operator new(sizeof(T), std::align_val_t(alignof(T)))) new T[5]; // calls operator new[](sizeof(T)*5 + overhead) // (C++17) or operator new(sizeof(T)*5+overhead, >std::align_val_t(alignof(T)))) new(2,f) T; // calls operator new(sizeof(T), 2, f) // (C++17) or operator new(sizeof(T), std::align_val_t(alignof(T)), 2, f)
new(2, f) T;
是做什么的?
What does
new(2, f) T;
do?
placement-new 中的第二个参数可用于将参数传递给您的自定义 T::operator new
实现。
这是一个触发它的玩具示例(在输出中,您可以看到参数 f=42.0
被传递给 T::operator new
):
#include <iostream>
struct T {
T() {
std::cout << "T::T called\n";
}
void* operator new(size_t s, int x, double f) {
std::cout << "T::new called with s=" << s << ", x=" << x << ", f=" << f << '\n';
return malloc(x * s);
}
char data[512];
};
int main() {
std::cout << "new T[5]:\n";
new T[5];
double f = 42.0;
std::cout << "\nnew(2, f) T:\n";
new(2, f) T;
}
输出:
new T[5]:
T::T called
T::T called
T::T called
T::T called
T::T called
new(2, f) T:
T::new called with s=512, x=2, f=42
T::T called
小心使用在线示例中的此类技巧,它们通常很糟糕。
C++ 中的 new
关键字在 C 中为 shorthand
typedef struct {
int a;
} Foo;
Foo *makeFoo(int a) {
Foo *foo = (Foo *)malloc(sizeof(Foo));
foo->a = a;
}
malloc
函数为该对象保留内存,表示它将用作指针。 new
运算符的作用相同,但默认为 sizeof(Foo)
。您看到的参数是 sizeof
和一个 align_val_t
实例的结果。