我在GNU的C++编译器上尝试这个代码,我无法理解它的行为:
#include <stdio.h>;
int main()
{
int num1 = 1000000000;
long num2 = 1000000000;
long long num3;
//num3 = 100000000000;
long long num4 = ~0;
printf("%u %u %u", sizeof(num1), sizeof(num2), sizeof(num3));
printf("%d %ld %lld %llu", num1, num2, num3, num4);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我取消注释注释行时,代码不会编译并给出错误:
错误:对于long类型,整数常量太大
但是,如果代码按原样编译并执行,则会产生远大于10000000000的值.
为什么?
我了解到,默认情况下,程序中的I/O是缓冲的,即它们从临时存储器提供给请求程序.我知道缓冲可以提高IO性能(可能通过减少系统调用).我已经看到了禁用缓冲的示例,例如setvbuf在C中.两种模式之间有什么区别?何时应该使用另一种模式?
是否有可能在gdb中转到当前执行行之前的一行.例如:
void my_fun( somePtrType** arr,int start,int end)
{
// arr is an array of pointers to somePtrType
//line a
... some assignments
swap(&arr[ind1] , &arr[ind2] ) ;
//line b (current line )
}
Run Code Online (Sandbox Code Playgroud)
我现在在b行,可以检查arr那里的值,但我想回到第一行并检查arr那时的内容.
我认为这可能是不可能的,因为调试器可以以慢动作运行代码,但不能使其向后执行.
更多见解..
为什么以及如何 __attribute__在GNU C程序中使用?
我有一个由dlsym()返回的void指针,我想调用void指针指向的函数.所以我通过强制转换进行类型转换:
void *gptr = dlsym(some symbol..) ;
typedef void (*fptr)();
fptr my_fptr = static_cast<fptr>(gptr) ;
Run Code Online (Sandbox Code Playgroud)
我也试过reinterpret_cast但没有运气,虽然C演员似乎工作..
我有一些C++代码,我需要使用LRU技术实现缓存替换.
到目前为止,我知道实现LRU缓存替换的两种方法:
那么,哪些更适合在生产代码中使用?
他们还有其他更好的方法吗?
#include <iostream>
using namespace std;
class Duck {
public:
virtual void quack() = 0;
};
class BigDuck : public Duck {
public:
// void quack(); (uncommenting will make it compile)
};
void BigDuck::quack(){ cout << "BigDuckDuck::Quack\n"; }
int main() {
BigDuck b;
Duck *d = &b;
d->quack();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码不能编译.但是,当我在子类中声明虚函数时,它编译得很好.
如果编译器已经具有子类将覆盖的函数的签名,那么为什么需要重新声明?
任何见解?
考虑以下代码:
const char* someFun() {
// ... some stuff
return "Some text!!"
}
int main()
{
{ // Block: A
const char* retStr = someFun();
// use retStr
}
}
Run Code Online (Sandbox Code Playgroud)
在函数中someFun(),"Some text!!"存储的位置(我认为它可能在ROM的某个静态区域)以及它是什么范围 一生?
指向的内存是否会在retStr整个程序中被占用,或者在块A退出后被释放?
比方说我有一个数据类型,X我想知道它的大小而不声明该类型的变量或指针,当然不使用sizeof运算符.
这可能吗?我想过使用标准头文件,其中包含数据类型的大小和范围,但不适用于用户定义的数据类型.
我有一个应用程序,其中一部分使用共享库.这些库在编译时链接.
在运行时,加载器期望共享对象在LD_LIBRARY_PATH,如果没有找到整个应用程序崩溃,错误"无法加载共享库".注意,不能保证客户端将拥有库,在这种情况下我想要应用程序留下合适的错误消息,独立部分也应该正常工作.
为此,我使用dlsym()并dlopen()在共享库中使用API.这个问题是如果我在API中有很多功能,我必须单独使用dlsym()和ptrs 访问它们,在我的情况下会导致内存损坏和代码崩溃.
这有什么替代方案吗?