在玩游戏时git,我有时会尝试一些东西,然后中止需要太长时间的git svn命令(例如在网络问题期间挂起的某些命令).这让我想到:
强制中止命令(Ctrl-C或kill)是否总是安全的?如果命令崩溃(内存不足,错误,网络/ FS问题)怎么办?存储库更改是"事务性的",因为不完整的更改会"回滚"(如在版本控制文件系统中)吗?或者在这种情况下我是否存在存储库损坏风险
我确信使用git的聪明人必须考虑到这一点,但我在git手册或网上找不到任何信息.
一些动态类型语言使用指针标记作为识别或缩小所表示值的运行时类型的快速方法.执行此操作的经典方法是将指针转换为适当大小的整数,并在最低有效位上添加标记值,对于对齐的对象,这些位被假定为零.当需要访问对象时,标记位被屏蔽掉,整数转换为指针,指针被正常解除引用.
这本身就是有序的,除了它都取决于一个巨大的假设:对齐的指针将转换为保证在正确位置具有零位的整数.
是否可以根据标准的字母保证这一点?
虽然标准的6.3.2.3节(参考C11草案)说从指针到整数的转换结果是实现定义的,但我想知道的是6.5.2.1和6.5.6中的指针算术规则是否有效约束指针 - >整数转换的结果遵循许多程序已经假设的相同的可预测算术规则.(6.3.2.3注释67似乎表明这是标准的预期精神,而不是那意味着很多.)
我特别想到的情况是,人们可能会分配一个大型数组作为动态语言的堆,因此我们所讨论的指针是这个数组的元素.我假设C分配数组本身的开始可以通过一些辅助手段放置在对齐位置(尽管如此也是这样讨论).假设我们有一个八字节"cons cell"数组; 我们可以保证指向任何给定单元格的指针将转换为标记最低三位的整数吗?
例如:
typedef Cell ...; // such that sizeof(Cell) == 8
Cell heap[1024]; // such that ((uintptr_t)&heap[0]) & 7 == 0
((char *)&heap[11]) - ((char *)&heap[10]); // == 8
(Cell *)(((char *)&heap[10]) + 8); // == &heap[11]
&(&heap[10])[0]; // == &heap[10]
0[heap]; // == heap[0]
// So...
&((char *)0)[(uintptr_t)&heap[10]]; // == &heap[10] ?
&((char *)0)[(uintptr_t)&heap[10] + 8]; // == &heap[11] ?
// ...implies?
(Cell *)((uintptr_t)&heap[10] + …Run Code Online (Sandbox Code Playgroud) 我知道gcc有一个选项-Wcast-align,只要指针被转换就会发出警告,以便增加目标所需的对齐.
这是我的计划:
char data[10];
int ptr = *((int *)data);
Run Code Online (Sandbox Code Playgroud)
在我的机器上,数据的对齐要求是1,而ptr是8.
为什么我没有收到警告?
可能是因为我正在为x86编译吗?
我理解通常SSL(或更确切地说是X.509)证书应由某些认证机构签署,以确保它是真实的.
在某些情况下,不存在此类签名,例如,如果您为测试目的生成证书,或者您是证书颁发机构(根证书).在这些情况下,使用自签名证书.
我的问题:为什么要使用这种奇怪的自签名结构?为什么证书不能简单地没有任何签名?包含自签名签名收益的内容是什么?
或者仅仅因为它在技术上更容易(没有签名的特殊情况)总是在每个证书中都有签名,即使它是无意义的签名?
我刚刚开始围绕C中的函数指针.要了解函数指针的转换是如何工作的,我编写了以下程序.它基本上创建了一个函数指针,该函数指向一个带有一个参数的函数,将它转换为带有三个参数的函数指针,并调用该函数,提供三个参数.我很好奇会发生什么:
#include <stdio.h>
int square(int val){
return val*val;
}
void printit(void* ptr){
int (*fptr)(int,int,int) = (int (*)(int,int,int)) (ptr);
printf("Call function with parameters 2,4,8.\n");
printf("Result: %d\n", fptr(2,4,8));
}
int main(void)
{
printit(square);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这编译并运行时没有错误或警告(在Linux/x86上为gcc -Wall).我系统的输出是:
Call function with parameters 2,4,8.
Result: 4
Run Code Online (Sandbox Code Playgroud)
显然,多余的论点只是默默地被抛弃了.
现在我想了解这里发生了什么.
我来自Java,那里的类型检查要严格得多,所以这种行为让我有点困惑.也许我正在经历文化冲击:-).
我有一个有float田地的课.例如:
public class MultipleFields {
final int count;
final float floatValue;
public MultipleFields(int count, float floatValue) {
this.count = count;
this.floatValue = floatValue;
}
}
Run Code Online (Sandbox Code Playgroud)
我需要能够按值比较实例.现在我该如何正确实施 equals&hashCode?
通常的方式来实现equals,并hashCode是只考虑各个领域.例如,Eclipse将生成以下内容equals:
public boolean equals(Object obj) {
// irrelevant type checks removed
....
MultipleFields other = (MultipleFields) obj;
if (count != other.count)
return false;
if (Float.floatToIntBits(floatValue) != Float.floatToIntBits(other.floatValue))
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
(和类似的hashCode,基本上计算count* 31 + Float.floatToIntBits(floatValue)).
这个问题是我的FP值受到舍入错误的影响(它们可能来自用户输入,来自数据库等).所以我需要一个"宽容"的比较.
常见的解决方案是使用epsilon值进行比较(参见 …
我只是想开始使用Java EE和相关概念.但是,我在理解某些技术与它们扮演的角色之间的关系时遇到了一些麻烦.
据我所知,Java EE Servlet是一个在服务器内运行的Java类,它生成对请求的响应(通常是对HTTP请求的HTML响应,尽管Servlet理论上可以服务于任何协议).
我的问题:
谢谢你帮助我开始吧!
以下代码
public class TestComparison {
public static void main(String[] args) throws Exception {
boolean b = true;
Object o = new Boolean(true);
System.out.println("comparison result: "+
(o == b)); // Eclipse complains about this expression
}
}
Run Code Online (Sandbox Code Playgroud)
使用javacV1.7.0_15 编译时没有错误,并在运行时打印"false".但是,Eclipse Juno抱怨"不兼容的操作数类型Object和boolean".
显然,javac自动装配了原始布尔值b,然后通过对象相等进行比较o和自动装帧b,产生false,而Eclipse拒绝进行自动装箱.
根据Java语言规范,哪种是正确的行为?我应该在哪里提交错误?
注意:如果我更改oto 的类型Boolean,事情按预期工作:Eclipse接受代码,代码打印"true".
我做了一个本地分支,但后来意识到我不需要它.
如果我从本地仓库删除它,我是否也必须从遥控器中删除?我刚刚创建了那个分支,并没有添加,提交或推送任何内容 - 简而言之,我没有做任何事情.
我正在研究剖面仪,主要是仪器和采样.我想出了以下信息:
如果以上信息错误,请纠正我.
在此之后,我正在查看执行时间,有些人说仪器需要比采样更多的时间!它是否正确?
如果是的话为什么?在抽样中你必须支付过程之间的上下文切换价格,而在后者你在同一个程序中没有成本
我错过了什么吗?
干杯!=)