我只是有点困惑.
我什么时候应该使用nullptr?
我已经在一些网站上看到应该总是使用它,但是我不能为非指针设置nullptr,例如:
int myVar = nullptr; // Not a pointer ofcourse
Run Code Online (Sandbox Code Playgroud)
我应该总是使用NULL非指针和nullptr指针吗?
感谢任何帮助!我对c ++ 11(和c ++整体)很新.
我想做这样的事情
#include <iostream>
#include <memory>
struct Foo {};
using FooPtr = std::unique_ptr<Foo>;
FooPtr makeFoo() { return FooPtr(new Foo()); }
struct Baz
{
Baz(FooPtr foo) : Baz(std::move(foo), bar(foo)) {}
Baz(FooPtr foo, int something) : _foo{ std::move(foo) }, _something{ something } {}
private:
FooPtr _foo;
int _something;
static int bar(const FooPtr & ptr)
{
std::cout << "bar!" << std::endl;
return 42;
}
};
int main() {
Baz baz(makeFoo());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:函数参数求值的顺序是未指定的,因此传递将从一个参数中移出的值是安全的,并且调用具有相同实例的另一个函数的结果作为reference-to-const传递,作为另一个论点?
我认为这个问题可以归结为实际移动操作何时执行,我不完全清楚(特别是在开启优化时).
在文档中,我可以看到std::vector<bool>通过使每个布尔占据一个位来优化空间效率.从文档:
std :: vector的空间效率(以及它是否完全优化)是实现定义的方式.
这是否意味着它取决于编译器的实现?如果是,我在哪里可以检查我的编译器是否支持它?他们为什么不希望它得到支持?这似乎是一个非常简单而有效的实现.
如果没有,它意味着什么,如果我希望进行这种优化,它意味着什么?
我正在使用TDM GCC工具集.
考虑以下简单示例:
struct __attribute__ ((__packed__)) {
int code[1];
int place_holder[100];
} s;
void test(int n)
{
int i;
for (i = 0; i < n; i++) {
s.code[i] = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
for 循环正在写入code大小为 1 的字段 。之后的下一个字段code是place_holder。
我希望在 的情况下n > 1,写入code数组会溢出并1写入place_holder.
但是,在使用-O2(在 gcc 4.9.4 上但也可能在其他版本上)进行编译时,会发生一些有趣的事情。
编译器识别出代码可能溢出数组code,并将循环展开限制为 1 次迭代。
很容易看出,在编译-fdump-tree-all和查看最后一个树传递(“t.optimized”)时:
;; Function test (test, funcdef_no=0, decl_uid=1366, symbol_order=1)
Removing basic block …Run Code Online (Sandbox Code Playgroud) 我试图理解C中范围的确切含义.我能理解的是范围仅限于编译时间.例如,如果您从其他某个函数访问局部变量.这将导致编译时错误.另一方面,以下程序工作正常.这意味着C具有平坦的内存模型,并且可以在运行时访问任何内容.C书将范围与生命周期和可变可见性联系起来,我发现它很混乱.我认为所有这些术语仅适用于编译时.有人可以点亮吗?
#include "stdio.h"
int *ptr;
int func(void)
{
/** abc is a local variable **/
int abc = 132;
ptr = &abc;
return 0;
}
int func1(void)
{
/** although scope of abc is over still I can change the value in the address of abc **/
*ptr = 200;
printf("the value of abc=%d\r\n",*ptr);
}
int main(void)
{
func();
func1();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果:值abc= 200
用简单的话来说,范围是什么意思?它是在运行时还是编译时出现的?我们可以看到,我们可以在运行时访问任何内容.但是,如果我们不遵守规则,那么我们将得到编译错误.例如,另一个函数中的局部变量引用.编译器将抛出一个错误,说"变量未定义......".
我可以对变量说以下内容吗?
1) Scope attribute comes under compile time.
2) Lifetime attribute comes …Run Code Online (Sandbox Code Playgroud) 在C++ 11中std::map,是否有一些有效的迭代器x使得++ x保证相等map::begin()?我想检测一下我刚刚调用的函数(我的)是否已经从函数前面走了一个迭代器.该函数将迭代器向后移动一个位置.
答案是否适用于图书馆的其他部分?
我知道当你在C程序中做某些事情时,结果是不确定的.但是,编译器不应该生成无效(机器)代码,对吧?如果代码做错了,或者代码生成了段错误或其他什么,那将是合理的......
这应该是根据编译器规范发生的,还是编译器中的错误?
这是我正在使用的(简单)程序:
int main() {
char *ptr = 0;
*(ptr) = 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在编译-O3.那不应该生成无效的硬件指令,对吧?有了-O0,我在运行代码时遇到了段错误.这看起来更加明智.
编辑:它正在生成一条ud2指令......
我正在学习未定义的行为,并在没有任何明确解释的情况下偶然发现了这段代码:
#include <stdio.h>
#include <limits.h>
int foo ( int x) {
printf ("% d\n" , x ); //2147483647
printf ("% d\n" , x+1 ); //-2147483648 overflow
return ( x+1 ) > x ; // 1 but How????
}
int main ( void ) {
printf ("% d\n" , INT_MAX ); //2147483647
printf ("% d\n" , INT_MAX+1 ); //-2147483648 overflow
printf ("% d\n" , ( INT_MAX+1 ) > INT_MAX ); //0 makes sense, since -ve < +ve
printf ("% d\n" , …Run Code Online (Sandbox Code Playgroud) 我确实希望能够在不声明 lambda 的情况下使用 extFunction or std::maxorstd::min作为 square 方法的参数:
template<typename T>
T extFunction(T a, T b)
{
return a;
}
class Stuff
{
public:
template <typename F>
int square(int num, int num2, F&& func)
{
return func(num, num2);
}
};
int main()
{
Stuff s;
std::cout << s.square(1, 2, std::max<int>) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是编译器(gcc 11.1)告诉我:
函数不明确:“无法推导出模板参数‘
F’”
没有 lambdas 有没有一种简单的方法可以做到这一点?
编辑:
也许展示如何使用 lambdas 做到这一点会很有趣:
std::cout << s.square(1,2,[](auto&& a, auto&& b){return std::max(a,b);}) << std::endl; …Run Code Online (Sandbox Code Playgroud) #include<stdio.h>
void main(){
printf("%f\n",5/9); // prints 0.000000
printf("%f\n",9.0/5.0); // prints 1.800000
printf("%f\n",5/9); // prints 1.799999
}
Run Code Online (Sandbox Code Playgroud)
第 5 行值应像第 3 行一样打印 0.000000
我在本地机器和在线编译器中尝试过,结果是相同的