我看到有可能这样做,但我不明白这个兴趣.
内存中的文字究竟在哪里?(见下面的例子)
我不能修改文字,所以它应该是一个const char*,虽然编译器允许我使用char*,即使有大多数编译器标志也没有警告.
虽然const char*类型的隐式转换为char*类型给了我一个警告,见下文(在GCC上测试,但它在VC++ 2010上的行为类似).
另外,如果我修改一个const char的值(下面有一个技巧,GCC会更好地给我一个警告),它没有给出任何错误,我甚至可以修改并在GCC上显示它(尽管我猜它仍然是未定义的行为,我想知道为什么它没有对文字做同样的事情).这就是为什么我问这些文字存储在哪里,以及哪些更常见的const应该存储?
const char* a = "test";
char* b = a; /* warning: initialization discards qualifiers
from pointer target type (on gcc), error on VC++2k10 */
char *c = "test"; // no compile errors
c[0] = 'p'; /* bus error when execution (we are not supposed to
modify const anyway, so why can I and with no errors? And where is the
literal stored for I have a "bus error"?
I have 'access …Run Code Online (Sandbox Code Playgroud) 可能重复:
处理浮点数中的精度问题
我很惊讶为什么我试图在C中使用浮点数(使用GCC 3.2)并且它没有按照我的预期进行.作为示例:
int main() {
float nb = 3.11f;
nb *= 10;
printf("%f\n", nb);
}
Run Code Online (Sandbox Code Playgroud)
显示:31.099998
我对浮动的实现方式及其产生这种意外行为的原因感到好奇吗?
它们是非常不同的语言,它们处理异常的方式可能会有所不同.如何实现异常处理以及这些语言中的实现差异是什么?
我也问这个问题,因为我注意到与JavaScript版本相比,C++异常处理似乎非常慢.
我有一个关于编译器可能做的优化的问题.
下面的代码将说明一下(这是一个例子):
typedef struct test
{
short i;
} s_test;
int function1(char *bin)
{
s_test foo;
lock(gmutex);
foo.i = *(int*)bin * 8;
unlock(gmutex);
sleep(5);
//
// Here anything can happen to *bin in another thread
// an inline example here could be: *(volatile int *)bin = 42;
//
int b = foo.i + sizeof(char*);
return (b > 1000);
}
Run Code Online (Sandbox Code Playgroud)
编译器是否可以替换最后一行
return ((*(int*)bin * 8 + sizeof(char*)) > 1000);
Run Code Online (Sandbox Code Playgroud)
似乎没有使用-O2或-O3与gcc 4.4的情况,但是其他编译器和其他编译标志可能是这种情况吗?
c compiler-construction compiler-theory compiler-optimization visual-c++
我习惯使用 GDB,并且有一个等效的功能我无法在 LLDB 中找到。我希望能够在距函数基地址的某个偏移量处放置一个断点。使用 GDB 我可以做到:
b *(&functionX+20)
有没有办法用 LLDB 做到这一点?
如果基类没有虚拟析构函数(例如为了避免 vtable 条目)并且派生类只有基本属性,那么当基类的指针被删除时,它是否会释放 new 分配的所有内存?我知道派生类的析构函数不会被调用,但我想知道整个对象分配的内存是否会被释放?我还假设在派生指针上调用删除将释放整个内存空间。
另外,如果它不释放派生类的内存部分,那么在相同的情况下,它如何使用基类中的虚拟析构函数来知道要释放多少内存?
例子:
class Base {
public:
int a;
int b;
Base() {}
~Base() {}
};
class Derived : public Base {
public:
int c;
int d;
Derived() {}
~Derived() {}
};
int main() {
Base *p = new Derived();
delete p; // is memory allocated for Derived freed?
}
Run Code Online (Sandbox Code Playgroud) 我想知道一个可执行文件是否支持常见的安全保护,如NX标志,堆栈cookie或ASLR.似乎ASLR设置在操作系统级别,但您如何知道它已启用?在Windows上,某些可执行文件不支持ASLR,因此我想知道如何在Mac OS X上确定这一点.
我想在不指定所有系统或库函数的名称或地址的情况下执行此操作。
我基本上想使用 gdb 作为 strace 或 ltrace,但可以实时查看堆栈或内存地址。
谢谢!
c ×6
c++ ×5
standards ×3
debugging ×2
gdb ×2
unix ×2
architecture ×1
browser ×1
casting ×1
destructor ×1
exception ×1
java ×1
javascript ×1
linux ×1
lldb ×1
macos ×1
memory ×1
performance ×1
security ×1
url ×1
visual-c++ ×1
volatile ×1